/ Hex Artifact Content
Login

Artifact f6b10414b5bd88f2966a407caee09a8f1703f3c80e1a67a5b0945e9dea3ef409:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0600: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0610: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0620: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0630: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
0640: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
0650: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
0660: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
0670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
0680: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0690: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
06a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
06b0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
06c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
06d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
06e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
06f0: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
0700: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
0710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0720: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0730: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
0740: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0750: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0760: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0780: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0790: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
07a0: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
07b0: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
07c0: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
07d0: 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 45  TK_COLUMN) && pE
07e0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a 20  xpr->y.pTab ){. 
07f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
0800: 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69  3TableColumnAffi
0810: 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e 70 54  nity(pExpr->y.pT
0820: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
0830: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  mn);.  }.  if( o
0840: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
0850: 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  UMN ){.    asser
0860: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  t( pExpr->pLeft-
0870: 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53 65 6c  >flags&EP_xIsSel
0880: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
0890: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
08a0: 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 70  inity(.        p
08b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78 2e 70  Expr->pLeft->x.p
08c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
08d0: 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
08e0: 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b 0a 20  ].pExpr.    );. 
08f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0900: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
0910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
0920: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0930: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
0940: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
0950: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
0960: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0970: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
0990: 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74 68 61  ew Expr node tha
09a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  t.** implements 
09b0: 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  the COLLATE oper
09c0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
09d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
09e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
09f0: 20 74 68 61 74 20 66 61 63 74 20 69 73 20 72 65   that fact is re
0a00: 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72 73 65  corded in pParse
0a10: 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ->db.** and the 
0a20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
0a30: 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e 63 68  is returned unch
0a40: 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  anged..*/.Expr *
0a50: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0a60: 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20 50 61  llateToken(.  Pa
0a70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0a80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0aa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
0ab0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
0ac0: 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61  he "COLLATE" cla
0ad0: 75 73 65 20 74 6f 20 74 68 69 73 20 65 78 70 72  use to this expr
0ae0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ession */.  cons
0af0: 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  t Token *pCollNa
0b00: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
0b10: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0b20: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ce */.  int dequ
0b30: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
0b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75   /* True to dequ
0b50: 6f 74 65 20 70 43 6f 6c 6c 4e 61 6d 65 20 2a 2f  ote pCollName */
0b60: 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e  .){.  if( pCollN
0b70: 61 6d 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  ame->n>0 ){.    
0b80: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
0b90: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
0ba0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c  arse->db, TK_COL
0bb0: 4c 41 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c  LATE, pCollName,
0bc0: 20 64 65 71 75 6f 74 65 29 3b 0a 20 20 20 20 69   dequote);.    i
0bd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
0be0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0bf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
0c00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f  ->flags |= EP_Co
0c10: 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a 20  llate|EP_Skip;. 
0c20: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
0c30: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  w;.    }.  }.  r
0c40: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 45  eturn pExpr;.}.E
0c50: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0c60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
0c70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
0c90: 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20 20  st char *zC){.  
0ca0: 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65 72  Token s;.  asser
0cb0: 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73 71  t( zC!=0 );.  sq
0cc0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
0cd0: 73 2c 20 28 63 68 61 72 2a 29 7a 43 29 3b 0a 20  s, (char*)zC);. 
0ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0cf0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0d00: 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
0d10: 2c 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  , &s, 0);.}../*.
0d20: 2a 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79  ** Skip over any
0d30: 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72   TK_COLLATE oper
0d40: 61 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e  ators and any un
0d50: 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c  likely().** or l
0d60: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63  ikelihood() func
0d70: 74 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74  tion at the root
0d80: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0d90: 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  n..*/.Expr *sqli
0da0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
0db0: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
0dc0: 0a 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20  .  while( pExpr 
0dd0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
0de0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69  ty(pExpr, EP_Ski
0df0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78  p) ){.    if( Ex
0e00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0e10: 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79  xpr, EP_Unlikely
0e20: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
0e30: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
0e40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
0e50: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
0e60: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0e70: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  >x.pList->nExpr>
0e80: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
0e90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0ea0: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
0eb0: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
0ec0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0ed0: 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
0ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0ef0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
0f00: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70  LLATE );.      p
0f10: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
0f20: 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  eft;.    }.  }  
0f30: 20 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72   .  return pExpr
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0f50: 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
0f60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0f80: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0f90: 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c  s no defined col
0fa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
0fb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
0fc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
0fd0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
0fe0: 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  eq().**.** The s
0ff0: 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c  qlite3ExprNNColl
1000: 53 65 71 28 29 20 77 6f 72 6b 73 20 74 68 65 20  Seq() works the 
1010: 73 61 6d 65 20 65 78 61 63 74 20 74 68 61 74 20  same exact that 
1020: 69 74 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  it returns the.*
1030: 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  * default collat
1040: 69 6f 6e 20 69 66 20 70 45 78 70 72 20 68 61 73  ion if pExpr has
1050: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
1060: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1070: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1080: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
1090: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
10a0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
10b0: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
10c0: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
10d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
10e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10f0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
1100: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
1110: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
1120: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
1130: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
1140: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
1150: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
1160: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
1170: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
1180: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
1190: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
11c0: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
11d0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
11e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
11f0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
1200: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
1210: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
1220: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52      if( op==TK_R
1230: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
1240: 2d 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28  ->op2;.    if( (
1250: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1260: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
1270: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  MN || op==TK_TRI
1280: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1290: 3e 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29  >y.pTab!=0.    )
12a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54  {.      /* op==T
12b0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
12c0: 3e 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65  >y.pTab!=0 happe
12d0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
12e0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
12f0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
1300: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1310: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1320: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1330: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1340: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1350: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1360: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1380: 20 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43   = p->y.pTab->aC
1390: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
13a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
13b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
13c0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
13d0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
13e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
1400: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1410: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1420: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1430: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1440: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1450: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1460: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1470: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1480: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1490: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
14a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
14c0: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
14d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14e0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
14f0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
1500: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
1510: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
1520: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
1530: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1540: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1550: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1560: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1570: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1580: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1590: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
15a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
15c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
15d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
15e0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
15f0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
1600: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
1610: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
1620: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
1630: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1640: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1650: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1660: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1670: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1680: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1690: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
16a0: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
16b0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
16c0: 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70 72   && ALWAYS(!Expr
16d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
16e0: 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b  P_xIsSelect)) ){
16f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1700: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1710: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1720: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1740: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1750: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1760: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1770: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1790: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
17a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
17b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
17f0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1820: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1830: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1840: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1850: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1860: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1870: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1880: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1890: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
18a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
18b0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
18c0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
18d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18e0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
18f0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1900: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1910: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1920: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1930: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1940: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1950: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1960: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1970: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1980: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1990: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
19a0: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
19b0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
19c0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
19d0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
19e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
19f0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1a00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1a10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1a20: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1a30: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1a40: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1a60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a80: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1a90: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1aa0: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ab0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ad0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1ae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1af0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1b20: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1b30: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1b40: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1b50: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1b60: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1b70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1b80: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1b90: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1ba0: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1bb0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1bc0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1bd0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1be0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1bf0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1c00: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1c10: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1c20: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1c30: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1c40: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1c50: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1c60: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1c70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1c80: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1c90: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1ca0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1cb0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1cc0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1cd0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
1ce0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
1cf0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1d00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1d10: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1d20: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1d30: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1d40: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1d50: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1d60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d70: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1d80: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1d90: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1da0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1db0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1dc0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1dd0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1de0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1e00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1e10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1e20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1e30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1e40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
1e50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
1e60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
1e70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
1e80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1ea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1eb0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1ec0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1ed0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1ee0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1ef0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1f10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1f20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1f40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
1f50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
1f60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
1f70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1f80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1f90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1fa0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1fb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1fd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1fe0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1ff0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
2000: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
2010: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
2020: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
2030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
2040: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
2050: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
2060: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2070: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
2080: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
2090: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
20a0: 5f 4e 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _NE || pExpr->op
20b0: 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72  ==TK_IS || pExpr
20c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
20d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20e0: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
20f0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
2100: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
2110: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
2120: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
2130: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
2140: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
2150: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
2160: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
2170: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2180: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
2190: 65 63 74 29 20 29 7b 0a 20 20 20 20 61 66 66 20  ect) ){.    aff 
21a0: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
21b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
21c0: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
21d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
21e0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
21f0: 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61   aff==0 ){.    a
2200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
2210: 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BLOB;.  }.  retu
2220: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
2230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
2240: 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f  arison expressio
2250: 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c  n, eg. '=', '<',
2260: 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a   IN(...) etc..**
2270: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73   idx_affinity is
2280: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
2290: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
22a0: 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a  mn. Return true.
22b0: 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ** if the index 
22c0: 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64  with affinity id
22d0: 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62  x_affinity may b
22e0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22f0: 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61  ent.** the compa
2300: 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a  rison in pExpr..
2310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
2320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78  dexAffinityOk(Ex
2330: 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20  pr *pExpr, char 
2340: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20  idx_affinity){. 
2350: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
2360: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
2370: 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28  Expr);.  switch(
2380: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
2390: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23a0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
23b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
23c0: 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20  E_AFF_TEXT:.    
23d0: 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66    return idx_aff
23e0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
23f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61  F_TEXT;.    defa
2400: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2410: 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  n sqlite3IsNumer
2420: 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61  icAffinity(idx_a
2430: 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a  ffinity);.  }.}.
2440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2450: 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20  e P5 value that 
2460: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
2470: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
2480: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
2490: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
24a0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
24b0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
24c0: 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69  pExpr2..*/.stati
24d0: 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61  c u8 binaryCompa
24e0: 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72  reP5(Expr *pExpr
24f0: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
2500: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
2510: 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68  {.  u8 aff = (ch
2520: 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66  ar)sqlite3ExprAf
2530: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
2540: 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c 69    aff = (u8)sqli
2550: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
2560: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 20  ty(pExpr1, aff) 
2570: 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c 6c  | (u8)jumpIfNull
2580: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
2590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
25c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
25d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
25e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
25f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
2600: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
2610: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
2620: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
2630: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
2640: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2650: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
2660: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
2670: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
2680: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
2690: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
26a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
26b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
26c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
26d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
26e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
26f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
2700: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
2710: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
2720: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
2730: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
2740: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
2750: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
2760: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
2770: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
2780: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
2790: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
27a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
27b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
27c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
27d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
27e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
27f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
2800: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
2810: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2820: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2830: 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  eft);.  }else if
2840: 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52 69  ( pRight && (pRi
2850: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
2860: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
2870: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2880: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2890: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
28a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
28b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
28c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
28d0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
28e0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
28f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2900: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2910: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
2920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
2930: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
2940: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2950: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
2960: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
2970: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
2980: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2990: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
29a0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
29b0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
29c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
29d0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
29e0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
29f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2a10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2a20: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2a30: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2a40: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2a50: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2a60: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
2a70: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
2a80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
2a90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
2aa0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
2ab0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
2ac0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2ad0: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2ae0: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2af0: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2b00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2b10: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2b20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2b30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2b40: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2b50: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2b60: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
2b70: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
2b80: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
2b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ba0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
2bb0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
2bc0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2bf0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2c00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c10: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2c20: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72 65 74  , (u8)p5);.  ret
2c30: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2c40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2c50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
2c60: 70 72 20 69 73 20 61 20 76 65 63 74 6f 72 2c 20  pr is a vector, 
2c70: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65 63 74  se..**.** A vect
2c90: 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  or is defined as
2ca0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cb0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
2cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  two or more.** c
2cd0: 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75 6c 74  olumns of result
2ce0: 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45 43 54  .  Every TK_VECT
2cf0: 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20 76 65  OR node is an ve
2d00: 63 74 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  ctor because the
2d10: 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c 6c 20  .** parser will 
2d20: 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61 20 54  not generate a T
2d30: 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20 66 65  K_VECTOR with fe
2d40: 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65 6e 74  wer than two ent
2d50: 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61 20 54  ries..** But a T
2d60: 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74 20 62  K_SELECT might b
2d70: 65 20 65 69 74 68 65 72 20 61 20 76 65 63 74 6f  e either a vecto
2d80: 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e 20 49  r or a scalar. I
2d90: 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 6f 6e  t is only.** con
2da0: 73 69 64 65 72 65 64 20 61 20 76 65 63 74 6f 72  sidered a vector
2db0: 20 69 66 20 69 74 20 68 61 73 20 74 77 6f 20 6f   if it has two o
2dc0: 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f  r more result co
2dd0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lumns..*/.int sq
2de0: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2df0: 72 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  r(Expr *pExpr){.
2e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e10: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
2e20: 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  Expr)>1;.}../*.*
2e30: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
2e40: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
2e50: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
2e60: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
2e70: 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72 6e 20  CTOR .** return 
2e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78  the number of ex
2e90: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2ea0: 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69 66 20   vector. Or, if 
2eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2ec0: 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
2ed0: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  t, return the nu
2ee0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ef0: 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  in the sub-selec
2f00: 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20 6f 74  t. For.** any ot
2f10: 68 65 72 20 74 79 70 65 20 6f 66 20 65 78 70 72  her type of expr
2f20: 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 31  ession, return 1
2f30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 45  ExprVectorSize(E
2f50: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75  xpr *pExpr){.  u
2f60: 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70  8 op = pExpr->op
2f70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
2f80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
2f90: 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69 66 28  Expr->op2;.  if(
2fa0: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29   op==TK_VECTOR )
2fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  {.    return pEx
2fc0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2fd0: 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pr;.  }else if( 
2fe0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
2ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70  .    return pExp
3000: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  List->nExpr;.  }
3020: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3030: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3040: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3050: 72 20 74 6f 20 61 20 73 75 62 65 78 70 72 65 73  r to a subexpres
3060: 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f 72 20  sion of pVector 
3070: 74 68 61 74 20 69 73 20 74 68 65 20 69 2d 74 68  that is the i-th
3080: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  .** column of th
3090: 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62 65 72  e vector (number
30a0: 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ed starting with
30b0: 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72   0).  The caller
30c0: 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72 65 20   must.** ensure 
30d0: 74 68 61 74 20 69 20 69 73 20 77 69 74 68 69 6e  that i is within
30e0: 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
30f0: 20 70 56 65 63 74 6f 72 20 69 73 20 72 65 61 6c   pVector is real
3100: 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61 6e 64  ly a scalar (and
3110: 20 22 73 63 61 6c 61 72 22 20 68 65 72 65 20 69   "scalar" here i
3120: 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65 72 69  ncludes subqueri
3130: 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74 75 72  es.** that retur
3140: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
3150: 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72 6e 20  n!) then return 
3160: 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69 66 69  pVector unmodifi
3170: 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63 74 6f  ed..**.** pVecto
3180: 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73  r retains owners
3190: 68 69 70 20 6f 66 20 74 68 65 20 72 65 74 75 72  hip of the retur
31a0: 6e 65 64 20 73 75 62 65 78 70 72 65 73 73 69 6f  ned subexpressio
31b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
31c0: 76 65 63 74 6f 72 20 69 73 20 61 20 28 53 45 4c  vector is a (SEL
31d0: 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20 74 68  ECT ...) then th
31e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  e expression ret
31f0: 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75 73 74  urned is.** just
3200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3210: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74 65 72  for the i-th ter
3220: 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
3230: 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a 2a 20  set, and may.** 
3240: 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66 6f 72  not be ready for
3250: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65 63 61   evaluation beca
3260: 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75  use the table cu
3270: 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74  rsor has not yet
3280: 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74 69 6f  .** been positio
3290: 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ned..*/.Expr *sq
32a0: 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
32b0: 53 75 62 65 78 70 72 28 45 78 70 72 20 2a 70 56  Subexpr(Expr *pV
32c0: 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b 0a 20  ector, int i){. 
32d0: 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c 69 74   assert( i<sqlit
32e0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
32f0: 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20 20 69  (pVector) );.  i
3300: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
3310: 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72 29 20  Vector(pVector) 
3320: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3330: 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30 20 7c  Vector->op2==0 |
3340: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  | pVector->op==T
3350: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
3360: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3370: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c 7c 20  p==TK_SELECT || 
3380: 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 54 4b  pVector->op2==TK
3390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
33a0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33b0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e0: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
33f0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3400: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
3410: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
3420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
3430: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
3440: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
3450: 77 68 69 63 68 20 77 68 65 6e 20 70 61 73 73 65  which when passe
3460: 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 45  d to.** sqlite3E
3470: 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c 20 67  xprCode() will g
3480: 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65 63 65  enerate all nece
3490: 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20 63 6f  ssary code to co
34a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69 46 69  mpute.** the iFi
34b0: 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  eld-th column of
34c0: 20 74 68 65 20 76 65 63 74 6f 72 20 65 78 70 72   the vector expr
34d0: 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72 2e 0a  ession pVector..
34e0: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20 66  **.** It is ok f
34f0: 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65  or pVector to be
3500: 20 61 20 73 63 61 6c 61 72 20 28 61 73 20 6c 6f   a scalar (as lo
3510: 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d 30 29  ng as iField==0)
3520: 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  .  .** In that c
3530: 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
3540: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  e works like sql
3550: 69 74 65 33 45 78 70 72 44 75 70 28 29 2e 0a 2a  ite3ExprDup()..*
3560: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
3570: 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72 6e 65  owns the returne
3580: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  d Expr object an
3590: 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  d is responsible
35a0: 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69 6e 67   for.** ensuring
35b0: 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
35c0: 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74 75 61  ed value eventua
35d0: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
35e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
35f0: 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72 73 68   retains ownersh
3600: 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e 20 20  ip of pVector.  
3610: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 61 20  If pVector is a 
3620: 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20 74 68  TK_SELECT,.** th
3630: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  en the returned 
3640: 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65 66 65  object will refe
3650: 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20 61 6e  rence pVector an
3660: 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d 75 73  d so pVector mus
3670: 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61 6c 69  t remain.** vali
3680: 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65 20 6f  d for the life o
3690: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  f the returned o
36a0: 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65 63 74  bject.  If pVect
36b0: 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f  or is a TK_VECTO
36c0: 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c 61 72  R.** or a scalar
36d0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
36e0: 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65 6c 65  n it can be dele
36f0: 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ted as soon as t
3700: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
3710: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  eturns..**.** A 
3720: 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65 20 61  trick to cause a
3730: 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65 63 74   TK_SELECT pVect
3740: 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  or to be deleted
3750: 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a   together with.*
3760: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 45  * the returned E
3770: 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20 74 6f  xpr object is to
3780: 20 61 74 74 61 63 68 20 74 68 65 20 70 56 65 63   attach the pVec
3790: 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69 67 68  tor to the pRigh
37a0: 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  t field.** of th
37b0: 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f 53 45  e returned TK_SE
37c0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72  LECT_COLUMN Expr
37d0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78 70 72   object..*/.Expr
37e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72   *sqlite3ExprFor
37f0: 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20 20 50  VectorField(.  P
3800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
3820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3830: 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20   *pVector,      
3840: 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 2e 20   /* The vector. 
3850: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3860: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d 53 45  ions or a sub-SE
3870: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 46  LECT */.  int iF
3880: 69 65 6c 64 20 20 20 20 20 20 20 20 20 20 20 2f  ield           /
3890: 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f  * Which column o
38a0: 66 20 74 68 65 20 76 65 63 74 6f 72 20 74 6f 20  f the vector to 
38b0: 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 45  return */.){.  E
38c0: 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  xpr *pRet;.  if(
38d0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
38e0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 61  _SELECT ){.    a
38f0: 73 73 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e  ssert( pVector->
3900: 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
3910: 6c 65 63 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  lect );.    /* T
3920: 68 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  he TK_SELECT_COL
3930: 55 4d 4e 20 45 78 70 72 20 6e 6f 64 65 3a 0a 20  UMN Expr node:. 
3940: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 70 4c 65     **.    ** pLe
3950: 66 74 3a 20 20 20 20 20 20 20 20 20 20 20 70 56  ft:           pV
3960: 65 63 74 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ector containing
3970: 20 54 4b 5f 53 45 4c 45 43 54 2e 20 20 4e 6f 74   TK_SELECT.  Not
3980: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2a   deleted..    **
3990: 20 70 52 69 67 68 74 3a 20 20 20 20 20 20 20 20   pRight:        
39a0: 20 20 6e 6f 74 20 75 73 65 64 2e 20 20 42 75 74    not used.  But
39b0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   recursively del
39c0: 65 74 65 64 2e 0a 20 20 20 20 2a 2a 20 69 43 6f  eted..    ** iCo
39d0: 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e  lumn:         In
39e0: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
39f0: 69 6e 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a  in pVector.    *
3a00: 2a 20 69 54 61 62 6c 65 3a 20 20 20 20 20 20 20  * iTable:       
3a10: 20 20 20 30 20 6f 72 20 74 68 65 20 6e 75 6d 62     0 or the numb
3a20: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 6e  er of columns on
3a30: 20 74 68 65 20 4c 48 53 20 6f 66 20 61 6e 20 61   the LHS of an a
3a40: 73 73 69 67 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  ssignment.    **
3a50: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20   pLeft->iTable: 
3a60: 20 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72    First in an ar
3a70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20  ray of register 
3a80: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20  holding result, 
3a90: 6f 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  or 0.    **     
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ab0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
3ac0: 74 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a  t yet computed..
3ad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71      **.    ** sq
3ae0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3af0: 29 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73  ) specifically s
3b00: 6b 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69  kips the recursi
3b10: 76 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20  ve delete of.   
3b20: 20 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f   ** pLeft on TK_
3b30: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f  SELECT_COLUMN no
3b40: 64 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74  des.  But pRight
3b50: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f   is followed, so
3b60: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
3b70: 63 61 6e 20 62 65 20 61 74 74 61 63 68 65 64 20  can be attached 
3b80: 74 6f 20 70 52 69 67 68 74 20 74 6f 20 63 61 75  to pRight to cau
3b90: 73 65 20 74 68 69 73 20 6e 6f 64 65 20 74 6f 20  se this node to 
3ba0: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
3bb0: 66 0a 20 20 20 20 2a 2a 20 70 56 65 63 74 6f 72  f.    ** pVector
3bc0: 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65  .  Typically the
3bd0: 72 65 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69  re will be multi
3be0: 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  ple TK_SELECT_CO
3bf0: 4c 55 4d 4e 20 6e 6f 64 65 73 0a 20 20 20 20 2a  LUMN nodes.    *
3c00: 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
3c10: 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f  pLeft pointer to
3c20: 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20 62 75   the pVector, bu
3c30: 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  t only one of th
3c40: 65 6d 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6f  em.    ** will o
3c50: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3c60: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3c80: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3c90: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
3ca0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
3cb0: 20 20 20 20 20 20 70 52 65 74 2d 3e 69 43 6f 6c        pRet->iCol
3cc0: 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20  umn = iField;.  
3cd0: 20 20 20 20 70 52 65 74 2d 3e 70 4c 65 66 74 20      pRet->pLeft 
3ce0: 3d 20 70 56 65 63 74 6f 72 3b 0a 20 20 20 20 7d  = pVector;.    }
3cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
3d00: 74 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54  t==0 || pRet->iT
3d10: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  able==0 );.  }el
3d20: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 56 65 63  se{.    if( pVec
3d30: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54  tor->op==TK_VECT
3d40: 4f 52 20 29 20 70 56 65 63 74 6f 72 20 3d 20 70  OR ) pVector = p
3d50: 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d  Vector->x.pList-
3d60: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
3d70: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
3d80: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3d90: 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72 2c  se->db, pVector,
3da0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
3dc0: 28 70 50 61 72 73 65 2c 20 70 52 65 74 2c 20 70  (pParse, pRet, p
3dd0: 56 65 63 74 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  Vector);.  }.  r
3de0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
3df0: 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
3e00: 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20 74  on pExpr is of t
3e10: 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20 67  ype TK_SELECT, g
3e20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e30: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e 20  evaluate.** it. 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
3e50: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
3e60: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
3e70: 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a 2a  d (or, if the .*
3e80: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74  * sub-select ret
3e90: 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  urns more than o
3ea0: 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 66  ne column, the f
3eb0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
3ec0: 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72 73  .** of registers
3ed0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
3ee0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29 2e  sult is stored).
3ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
3f00: 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c 45  is not a TK_SELE
3f10: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72  CT expression, r
3f20: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
3f30: 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 53  ic int exprCodeS
3f40: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
3f50: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
3f60: 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67 20  xpr){.  int reg 
3f70: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
3f80: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3f90: 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  Y.  if( pExpr->o
3fa0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
3fb0: 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74 65      reg = sqlite
3fc0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
3fd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
3fe0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3ff0: 72 6e 20 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn reg;.}../*.**
4000: 20 41 72 67 75 6d 65 6e 74 20 70 56 65 63 74 6f   Argument pVecto
4010: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 65  r points to a ve
4020: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
4030: 2d 20 65 69 74 68 65 72 20 61 20 54 4b 5f 56 45  - either a TK_VE
4040: 43 54 4f 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45  CTOR.** or TK_SE
4050: 4c 45 43 54 20 74 68 61 74 20 72 65 74 75 72 6e  LECT that return
4060: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
4070: 63 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e  column. This fun
4080: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
4090: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
40a0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 69 73 74  mber of a regist
40b0: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
40c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
40d0: 20 65 6c 65 6d 65 6e 74 20 69 46 69 65 6c 64 20   element iField 
40e0: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a  of the vector..*
40f0: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
4100: 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 65  is a TK_SELECT e
4110: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4120: 63 6f 64 65 20 66 6f 72 20 69 74 20 6d 75 73 74  code for it must
4130: 20 68 61 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64   have .** alread
4140: 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  y been generated
4150: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 43   using the exprC
4160: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 29 20 72  odeSubselect() r
4170: 6f 75 74 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a  outine. In this.
4180: 2a 2a 20 63 61 73 65 20 70 61 72 61 6d 65 74 65  ** case paramete
4190: 72 20 72 65 67 53 65 6c 65 63 74 20 73 68 6f 75  r regSelect shou
41a0: 6c 64 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ld be the first 
41b0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
41c0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74  egisters.** cont
41d0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
41e0: 74 73 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  ts of the sub-se
41f0: 6c 65 63 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  lect. .**.** If 
4200: 70 56 65 63 74 6f 72 20 69 73 20 6f 66 20 74 79  pVector is of ty
4210: 70 65 20 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68  pe TK_VECTOR, th
4220: 65 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  en code for the 
4230: 72 65 71 75 65 73 74 65 64 20 66 69 65 6c 64 0a  requested field.
4240: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  ** is generated.
4250: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 2a   In this case (*
4260: 70 52 65 67 46 72 65 65 29 20 6d 61 79 20 62 65  pRegFree) may be
4270: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
4280: 65 72 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  er of.** a tempo
4290: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 6f  rary register to
42a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
42b0: 20 63 61 6c 6c 65 72 20 62 65 66 6f 72 65 20 72   caller before r
42c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
42d0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
42e0: 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  , output paramet
42f0: 65 72 20 28 2a 70 70 45 78 70 72 29 20 69 73 20  er (*ppExpr) is 
4300: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4310: 74 68 65 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65  the.** Expr obje
4320: 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
4330: 20 74 6f 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65   to element iEle
4340: 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e  m of the vector.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4360: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4370: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4380: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
4390: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
43a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
43b0: 2a 70 56 65 63 74 6f 72 2c 20 20 20 20 20 20 20  *pVector,       
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65             /* Ve
43d0: 63 74 6f 72 20 74 6f 20 65 78 74 72 61 63 74 20  ctor to extract 
43e0: 65 6c 65 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  element from */.
43f0: 20 20 69 6e 74 20 69 46 69 65 6c 64 2c 20 20 20    int iField,   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 2f 2a 20 46 69 65 6c 64 20 74 6f 20 65 78    /* Field to ex
4420: 74 72 61 63 74 20 66 72 6f 6d 20 70 56 65 63 74  tract from pVect
4430: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  or */.  int regS
4440: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  elect,          
4450: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4460: 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   in array of reg
4470: 69 73 74 65 72 73 20 2a 2f 0a 20 20 45 78 70 72  isters */.  Expr
4480: 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20   **ppExpr,      
4490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44a0: 55 54 3a 20 45 78 70 72 65 73 73 69 6f 6e 20 65  UT: Expression e
44b0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
44c0: 2a 70 52 65 67 46 72 65 65 20 20 20 20 20 20 20  *pRegFree       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
44e0: 55 54 3a 20 54 65 6d 70 20 72 65 67 69 73 74 65  UT: Temp registe
44f0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a  r to free */.){.
4500: 20 20 75 38 20 6f 70 20 3d 20 70 56 65 63 74 6f    u8 op = pVecto
4510: 72 2d 3e 6f 70 3b 0a 20 20 61 73 73 65 72 74 28  r->op;.  assert(
4520: 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c   op==TK_VECTOR |
4530: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
4540: 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  R || op==TK_SELE
4550: 43 54 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  CT );.  if( op==
4560: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
4570: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c     *ppExpr = sql
4580: 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
4590: 75 62 65 78 70 72 28 70 56 65 63 74 6f 72 2c 20  ubexpr(pVector, 
45a0: 69 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74  iField);.    ret
45b0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 69 54 61  urn pVector->iTa
45c0: 62 6c 65 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a  ble+iField;.  }.
45d0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
45e0: 45 43 54 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  ECT ){.    *ppEx
45f0: 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  pr = pVector->x.
4600: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
4610: 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72  >a[iField].pExpr
4620: 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 72 65  ;.     return re
4630: 67 53 65 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a  gSelect+iField;.
4640: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
4650: 70 56 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74  pVector->x.pList
4660: 2d 3e 61 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70  ->a[iField].pExp
4670: 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  r;.  return sqli
4680: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
4690: 70 50 61 72 73 65 2c 20 2a 70 70 45 78 70 72 2c  pParse, *ppExpr,
46a0: 20 70 52 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f   pRegFree);.}../
46b0: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
46c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
46d0: 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 74 77  rison between tw
46e0: 6f 20 76 65 63 74 6f 72 20 76 61 6c 75 65 73 2e  o vector values.
46f0: 20 43 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   Compute.** the 
4700: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
4710: 6d 70 61 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20  mparison (1, 0, 
4720: 6f 72 20 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69  or NULL) and wri
4730: 74 65 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  te that.** resul
4740: 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  t into register 
4750: 64 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dest..**.** The 
4760: 63 61 6c 6c 65 72 20 6d 75 73 74 20 73 61 74 69  caller must sati
4770: 73 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  sfy the followin
4780: 67 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  g preconditions:
4790: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  .**.**    if pEx
47a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20  pr->op==TK_IS:  
47b0: 20 20 20 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e      op==TK_EQ an
47c0: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
47d0: 4c 45 51 0a 2a 2a 20 20 20 20 69 66 20 70 45 78  LEQ.**    if pEx
47e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
47f0: 3a 20 20 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e  :   op==TK_NE an
4800: 64 20 70 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  d p5==SQLITE_NUL
4810: 4c 45 51 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  LEQ.**    otherw
4820: 69 73 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ise:            
4830: 20 20 20 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f      op==pExpr->o
4840: 70 20 61 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73  p and p5==0.*/.s
4850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 56  tatic void codeV
4860: 65 63 74 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20  ectorCompare(.  
4870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4880: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 67 65        /* Code ge
4890: 6e 65 72 61 74 6f 72 20 63 6f 6e 74 65 78 74 20  nerator context 
48a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
48b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
48c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
48d0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
48e0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  dest,           
48f0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
4900: 74 73 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ts into this reg
4910: 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70  ister */.  u8 op
4920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4930: 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f   /* Comparison o
4940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20  perator */.  u8 
4950: 70 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p5              
4960: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c     /* SQLITE_NUL
4970: 4c 45 51 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29  LEQ or zero */.)
4980: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4990: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45  arse->pVdbe;.  E
49a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
49b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70  pr->pLeft;.  Exp
49c0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
49d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74  r->pRight;.  int
49e0: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
49f0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
4a00: 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  Left);.  int i;.
4a10: 20 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20    int regLeft = 
4a20: 30 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68  0;.  int regRigh
4a30: 74 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20  t = 0;.  u8 opx 
4a40: 3d 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72  = op;.  int addr
4a50: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
4a70: 73 65 29 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66  se);..  if( nLef
4a80: 74 21 3d 73 71 6c 69 74 65 33 45 78 70 72 56 65  t!=sqlite3ExprVe
4a90: 63 74 6f 72 53 69 7a 65 28 70 52 69 67 68 74 29  ctorSize(pRight)
4aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4ac0: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
4ad0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
4ae0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
4b00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b10: 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_NE .       || 
4b20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4b30: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4b40: 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20  K_ISNOT .       
4b50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b60: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
4b70: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
4b80: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4b90: 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LE || pExpr->op
4ba0: 3d 3d 54 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20  ==TK_GE .  );.  
4bb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
4bc0: 70 3d 3d 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d  p==op || (pExpr-
4bd0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70  >op==TK_IS && op
4be0: 3d 3d 54 4b 5f 45 51 29 0a 20 20 20 20 20 20 20  ==TK_EQ).       
4bf0: 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e       || (pExpr->
4c00: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20  op==TK_ISNOT && 
4c10: 6f 70 3d 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20  op==TK_NE) );.  
4c20: 61 73 73 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c  assert( p5==0 ||
4c30: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
4c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 35 3d 3d  ;.  assert( p5==
4c50: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c  SQLITE_NULLEQ ||
4c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29   pExpr->op==op )
4c70: 3b 0a 0a 20 20 70 35 20 7c 3d 20 53 51 4c 49 54  ;..  p5 |= SQLIT
4c80: 45 5f 53 54 4f 52 45 50 32 3b 0a 20 20 69 66 28  E_STOREP2;.  if(
4c90: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
4ca0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28  x = TK_LT;.  if(
4cb0: 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70   opx==TK_GE ) op
4cc0: 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65  x = TK_GT;..  re
4cd0: 67 4c 65 66 74 20 3d 20 65 78 70 72 43 6f 64 65  gLeft = exprCode
4ce0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
4cf0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 72 65 67 52  , pLeft);.  regR
4d00: 69 67 68 74 20 3d 20 65 78 70 72 43 6f 64 65 53  ight = exprCodeS
4d10: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
4d20: 20 70 52 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72   pRight);..  for
4d30: 28 69 3d 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65  (i=0; 1 /*Loop e
4d40: 78 69 74 73 20 62 79 20 22 62 72 65 61 6b 22 2a  xits by "break"*
4d50: 2f 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  /; i++){.    int
4d60: 20 72 65 67 46 72 65 65 31 20 3d 20 30 2c 20 72   regFree1 = 0, r
4d70: 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 20  egFree2 = 0;.   
4d80: 20 45 78 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20   Expr *pL, *pR; 
4d90: 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  .    int r1, r2;
4da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
4db0: 30 20 26 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a  0 && i<nLeft );.
4dc0: 20 20 20 20 72 31 20 3d 20 65 78 70 72 56 65 63      r1 = exprVec
4dd0: 74 6f 72 52 65 67 69 73 74 65 72 28 70 50 61 72  torRegister(pPar
4de0: 73 65 2c 20 70 4c 65 66 74 2c 20 69 2c 20 72 65  se, pLeft, i, re
4df0: 67 4c 65 66 74 2c 20 26 70 4c 2c 20 26 72 65 67  gLeft, &pL, &reg
4e00: 46 72 65 65 31 29 3b 0a 20 20 20 20 72 32 20 3d  Free1);.    r2 =
4e10: 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69 73   exprVectorRegis
4e20: 74 65 72 28 70 50 61 72 73 65 2c 20 70 52 69 67  ter(pParse, pRig
4e30: 68 74 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c  ht, i, regRight,
4e40: 20 26 70 52 2c 20 26 72 65 67 46 72 65 65 32 29   &pR, &regFree2)
4e50: 3b 0a 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72  ;.    codeCompar
4e60: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4e70: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4e80: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 74 65  est, p5);.    te
4e90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
4ea0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
4eb0: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
4ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
4ed0: 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
4ee0: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
4ef0: 5f 4c 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Le);.    testca
4f00: 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
4f10: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4f20: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
4f30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4f40: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
4f50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
4f60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
4f70: 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
4f80: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
4f90: 4f 50 5f 45 71 29 3b 0a 20 20 20 20 74 65 73 74  OP_Eq);.    test
4fa0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
4fb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4fc0: 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
4fd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4fe0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
4ff0: 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 73  regFree1);.    s
5000: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5010: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
5020: 46 72 65 65 32 29 3b 0a 20 20 20 20 69 66 28 20  Free2);.    if( 
5030: 69 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20  i==nLeft-1 ){.  
5040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5050: 0a 20 20 20 20 69 66 28 20 6f 70 78 3d 3d 54 4b  .    if( opx==TK
5060: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ ){.      sql
5070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5080: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74  , OP_IfNot, dest
5090: 2c 20 61 64 64 72 44 6f 6e 65 29 3b 20 56 64 62  , addrDone); Vdb
50a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
50b0: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
50c0: 5f 4b 45 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d  _KEEPNULL;.    }
50d0: 65 6c 73 65 20 69 66 28 20 6f 70 78 3d 3d 54 4b  else if( opx==TK
50e0: 5f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _NE ){.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5100: 2c 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61  , OP_If, dest, a
5110: 64 64 72 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f  ddrDone); VdbeCo
5120: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
5130: 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45   p5 |= SQLITE_KE
5140: 45 50 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  EPNULL;.    }els
5150: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
5160: 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70   op==TK_LT || op
5170: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 54  ==TK_GT || op==T
5180: 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LE || op==TK_G
5190: 45 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  E );.      sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
51b0: 4f 50 5f 45 6c 73 65 4e 6f 74 45 71 2c 20 30 2c  OP_ElseNotEq, 0,
51c0: 20 61 64 64 72 44 6f 6e 65 29 3b 0a 20 20 20 20   addrDone);.    
51d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
51e0: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 54 29 3b 0a  (v, op==TK_LT);.
51f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
5200: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47  geIf(v, op==TK_G
5210: 54 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  T);.      VdbeCo
5220: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
5230: 54 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 56 64  TK_LE);.      Vd
5240: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5250: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
5260: 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32    if( i==nLeft-2
5270: 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20   ) opx = op;.   
5280: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5290: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
52a0: 28 76 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a 7d  (v, addrDone);.}
52b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
52c0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
52d0: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
52e0: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
52f0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
5300: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5310: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
5320: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
5330: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
5340: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
5350: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
5360: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
5370: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5380: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
5390: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
53a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
53b0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
53c0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
53d0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
53e0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
53f0: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
5400: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
5410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5420: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
5430: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
5440: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
5450: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
5460: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
5470: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
5480: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5490: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
54a0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
54b0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
54c0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
54d0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
54e0: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
54f0: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5500: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5510: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5520: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5530: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5540: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5550: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5560: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5570: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5580: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5590: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
55a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
55b0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
55c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
55d0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
55e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
55f0: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5600: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5610: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5620: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5630: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5640: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5650: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5660: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5670: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5680: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
56a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
56b0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
56c0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
56d0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
56e0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
56f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5700: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5710: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5720: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5740: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
5770: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
5790: 66 6f 72 28 70 3d 70 53 65 6c 65 63 74 3b 20 70  for(p=pSelect; p
57a0: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
57b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
57c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
57d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
57e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
57f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
5800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
5820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5830: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
5840: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5870: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
5880: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5890: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
58a0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
58b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58c0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58d0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58e0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58f0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5900: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5910: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5920: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5930: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5940: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5950: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5960: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5970: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5980: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5990: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
59a0: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
59b0: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59c0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
59d0: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
59e0: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
59f0: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5a00: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5a10: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5a20: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
5a30: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
5a40: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
5a50: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
5a60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a70: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
5a80: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5a90: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5aa0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5ab0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ac0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5ad0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5ae0: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5af0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5b00: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5b10: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5b20: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5b30: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
5b40: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
5b50: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
5b60: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
5b70: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
5b80: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5b90: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5ba0: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5bb0: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5bc0: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5bd0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5be0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5bf0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5c00: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5c10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5c20: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
5c30: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
5c40: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
5c50: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
5c60: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
5c70: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
5c80: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5c90: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5ca0: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5cc0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5cd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ce0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5cf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5d00: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5d10: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5d20: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
5d30: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
5d40: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
5d50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
5d60: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5d70: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
5d80: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5d90: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5da0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5db0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5dd0: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5de0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5df0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5e00: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5e10: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5e20: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
5e30: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
5e40: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
5e50: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
5e60: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
5e70: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
5e80: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5e90: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5ea0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5eb0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5ec0: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5ed0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5ee0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5ef0: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5f00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5f10: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5f20: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
5f30: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5f40: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
5f50: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
5f60: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
5f70: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
5f80: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5f90: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5fa0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5fb0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5fc0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5fd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5fe0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5ff0: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
6000: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
6010: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
6020: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
6030: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
6050: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
6060: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
6070: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
6080: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
6090: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
60a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
60b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
60c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
60d0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
60e0: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
60f0: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
6100: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
6110: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
6120: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
6130: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
6140: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
6150: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
6160: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
6170: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
6180: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
6190: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
61a0: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
61b0: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
61c0: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
61d0: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
61e0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
61f0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
6200: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
6210: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
6220: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
6230: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
6240: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
6250: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
6260: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
6270: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
6280: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
6290: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
62a0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
62b0: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
62c0: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
62d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
62e0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
62f0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
6300: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
6310: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
6320: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
6330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
6340: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
6350: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
6360: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
6370: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
6380: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
6390: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
63a0: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
63b0: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
63c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
63d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
63e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
63f0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
6400: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
6410: 61 6c 6c 6f 63 52 61 77 4e 4e 28 29 20 2a 2f 0a  allocRawNN() */.
6420: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6440: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6450: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
6460: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
6470: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
6480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6490: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
64b0: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
64c0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
64d0: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
64e0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
64f0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6500: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6510: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
6520: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
6530: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
6540: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
6550: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
6560: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
6570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
6580: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
6590: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
65a0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
65b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
65c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
65d0: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
65e0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
65f0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
6600: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
6610: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
6620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
6630: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
6640: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
6650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
6660: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
6670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
6680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6690: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 4c 65 61  _IntValue|EP_Lea
66a0: 66 7c 28 69 56 61 6c 75 65 3f 45 50 5f 49 73 54  f|(iValue?EP_IsT
66b0: 72 75 65 3a 45 50 5f 49 73 46 61 6c 73 65 29 3b  rue:EP_IsFalse);
66c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
66d0: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
66e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
66f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
6700: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
6710: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
6720: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
6730: 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  >z!=0 || pToken-
6740: 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >n==0 );.       
6750: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29   if( pToken->n )
6760: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e   memcpy(pNew->u.
6770: 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e  zToken, pToken->
6780: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  z, pToken->n);. 
6790: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a         pNew->u.z
67a0: 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d  Token[pToken->n]
67b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
67c0: 28 20 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c  ( dequote && sql
67d0: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
67e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29  ->u.zToken[0]) )
67f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6800: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
6810: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
6820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6830: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6840: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6850: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6860: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6870: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6880: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6890: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
68a0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
68b0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
68c0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
68d0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
68e0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
68f0: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6900: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6910: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6920: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6930: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6940: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6950: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6960: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6970: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6980: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6990: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
69a0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
69b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
69c0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
69d0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
69e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
69f0: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6a00: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6a10: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6a20: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6a30: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6a40: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6a50: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6a60: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6a70: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6a80: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6a90: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6aa0: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6ab0: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6ac0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6ad0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6ae0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6af0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6b00: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6b10: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6b20: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6b30: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6b40: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6b50: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6b60: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6b70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6b90: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6bb0: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6bc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6bd0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6be0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
6bf0: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
6c00: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
6c10: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
6c20: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
6c30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
6c40: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
6c50: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
6c60: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
6c70: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
6c80: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
6c90: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
6ca0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
6cb0: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
6cc0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
6cd0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
6ce0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
6cf0: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
6d00: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
6d10: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
6d20: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
6d30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6d40: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
6d50: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
6d60: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6d70: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
6d80: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6d90: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
6da0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
6db0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
6dc0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
6dd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6df0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6e00: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
6e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
6e20: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
6e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e50: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
6e60: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 20 20   Expr *pRight   
6e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
6e80: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29 7b 0a  t operand */.){.
6e90: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 70 20 3d    Expr *p;.  p =
6ea0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6eb0: 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62  RawNN(pParse->db
6ec0: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
6ed0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6ee0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
6ef0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
6f00: 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 30 78 66  p->op = op & 0xf
6f10: 66 3b 0a 20 20 20 20 70 2d 3e 69 41 67 67 20 3d  f;.    p->iAgg =
6f20: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
6f30: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
6f40: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
6f50: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
6f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f70: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
6f80: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
6f90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
6fa0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
6fc0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
6fd0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6fe0: 65 2d 3e 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  e->db, pRight);.
6ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7000: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65  }../*.** Add pSe
7010: 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72  lect to the Expr
7020: 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64  .x.pSelect field
7030: 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20  .  Or, if pExpr 
7040: 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20  is NULL (due.** 
7050: 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  do a memory allo
7060: 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20  cation failure) 
7070: 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
7080: 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a  pSelect object..
7090: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
70a0: 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61  ExprAddSelect(Pa
70b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
70c0: 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74  r *pExpr, Select
70d0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66   *pSelect){.  if
70e0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ( pExpr ){.    p
70f0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20  Expr->x.pSelect 
7100: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45  = pSelect;.    E
7110: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7120: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
7130: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
7140: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7150: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
7160: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
7170: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7180: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
7190: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
71a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
71b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
71c0: 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  e->db, pSelect);
71d0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  .  }.}.../*.** J
71e0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
71f0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
7200: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
7210: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
7220: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
7230: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
7240: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
7250: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
7260: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
7270: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
7280: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
7290: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
72a0: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
72b0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
72c0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
72d0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
72e0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
72f0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
7300: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7310: 45 78 70 72 41 6e 64 28 50 61 72 73 65 20 2a 70  ExprAnd(Parse *p
7320: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c 65  Parse, Expr *pLe
7330: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
7340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7350: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7360: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 20 29   if( pLeft==0  )
7370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
7380: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
7390: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
73a0: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
73b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
73c0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
73d0: 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61 79 73  t) || ExprAlways
73e0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
73f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7400: 55 6e 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 70  UnmapAndDelete(p
7410: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
7420: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e     sqlite3ExprUn
7430: 6d 61 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61  mapAndDelete(pPa
7440: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
7450: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7460: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
7470: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
7480: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
7490: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
74a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
74b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
74c0: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
74d0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
74e0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
74f0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
7500: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
7510: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
7520: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
7530: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7540: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
7550: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7560: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7570: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7580: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7590: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
75a0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
75b0: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
75c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
75d0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
75e0: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
75f0: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
7600: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
7610: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
7620: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7630: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7640: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7650: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7660: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7670: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
7680: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
7690: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
76a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
76b0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
76c0: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
76d0: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
76e0: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
76f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7700: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
7710: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
7720: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
7730: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
7740: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
7750: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7760: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7770: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
7780: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
7790: 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  en);.  }.  pNew-
77a0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
77b0: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
77c0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73  rty(pNew, EP_Has
77d0: 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  Func);.  assert(
77e0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
77f0: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
7800: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
7810: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7820: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7830: 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69  pNew);.  if( eDi
7840: 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69  stinct==SF_Disti
7850: 6e 63 74 20 29 20 45 78 70 72 53 65 74 50 72 6f  nct ) ExprSetPro
7860: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44  perty(pNew, EP_D
7870: 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75  istinct);.  retu
7880: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7890: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
78a0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
78b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
78c0: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
78d0: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
78e0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
78f0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7900: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7910: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7920: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7930: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7940: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7950: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7960: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7970: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7980: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7990: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
79a0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
79b0: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
79c0: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
79d0: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
79e0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
79f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7a00: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7a10: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7a20: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7a30: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7a40: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7a50: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7a60: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7a70: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7a80: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7a90: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7aa0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7ab0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7ac0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7ad0: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7ae0: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7af0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7b00: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7b10: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
7b20: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
7b30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7b40: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
7b50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7b60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7b80: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
7b90: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
7ba0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
7bb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7bc0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
7bd0: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
7be0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
7bf0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
7c00: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
7c10: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
7c20: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
7c30: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
7c40: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7c50: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
7c60: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7c70: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7c80: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7c90: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7ca0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7cb0: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
7cc0: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
7cd0: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
7ce0: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
7cf0: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
7d00: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
7d10: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
7d20: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
7d30: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
7d40: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
7d50: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
7d60: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
7d70: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
7d80: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
7d90: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
7da0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
7db0: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
7dc0: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
7dd0: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
7de0: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
7df0: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
7e00: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
7e10: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
7e20: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
7e30: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
7e40: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7e50: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7e60: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
7e80: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
7e90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7ea0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
7eb0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
7ec0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7ed0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7ee0: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
7ef0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
7f00: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7f10: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
7f20: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
7f30: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
7f40: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
7f50: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7f60: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7f70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7f80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7f90: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
7fa0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
7fb0: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7fd0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7fe0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
7ff0: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
8000: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
8010: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8020: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
8030: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
8040: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8050: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
8060: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
8070: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8080: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
8090: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
80a0: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
80b0: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
80c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
80d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
80e0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
80f0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
8100: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
8110: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8120: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8130: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8140: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
8150: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
8160: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
8170: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
8180: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
8190: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
81a0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
81b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
81c0: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
81d0: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
81e0: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
81f0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
8200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
8210: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8220: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8230: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8250: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
8260: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
8270: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
8280: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
8290: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
82a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
82b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
82c0: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
82d0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
82e0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
82f0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
8300: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8310: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8320: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8340: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
8350: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8360: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
8370: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
8380: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8390: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
83a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
83b0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
83c0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
83d0: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
83e0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
83f0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
8400: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
8410: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8420: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8430: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8440: 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  ue>=0 );..  asse
8450: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8460: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8470: 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e  nc) || p->y.pWin
8480: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
8490: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
84a0: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
84b0: 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48  UNCTION || ExprH
84c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
84d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
84e0: 64 75 63 65 64 29 0a 20 20 20 20 20 20 20 20 20  duced).         
84f0: 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30   || p->y.pWin==0
8500: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
8510: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
8520: 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  c) );.#ifdef SQL
8530: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
8540: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8550: 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21  p, EP_Leaf) && !
8560: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8570: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8580: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8590: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
85a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
85b0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ight==0 );.    a
85c0: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c  ssert( p->x.pSel
85d0: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  ect==0 );.  }.#e
85e0: 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72  ndif.  if( !Expr
85f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28  HasProperty(p, (
8600: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8610: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a  Leaf)) ){.    /*
8620: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8630: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
8640: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
8650: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
8660: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
8670: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
8680: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8690: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
86a0: 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45   && p->op!=TK_SE
86b0: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71  LECT_COLUMN ) sq
86c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
86d0: 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  N(db, p->pLeft);
86e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
86f0: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
8700: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8710: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
8720: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78      }else if( Ex
8730: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8740: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
8750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
8760: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
8770: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
8780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8790: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
87a0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
87b0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
87c0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
87d0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
87e0: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  nc) ){.      ass
87f0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
8800: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
8810: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
8820: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 79 2e 70 57  lete(db, p->y.pW
8830: 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  in);.    }.  }. 
8840: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8850: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
8860: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
8870: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
8880: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 45 78  oken);.  if( !Ex
8890: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
88a0: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
88b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
88c0: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
88d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
88e0: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
88f0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
8900: 20 69 66 28 20 70 20 29 20 73 71 6c 69 74 65 33   if( p ) sqlite3
8910: 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ExprDeleteNN(db,
8920: 20 70 29 3b 0a 7d 0a 0a 2f 2a 20 49 6e 76 6f 6b   p);.}../* Invok
8930: 65 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45  e sqlite3RenameE
8940: 78 70 72 55 6e 6d 61 70 28 29 20 61 6e 64 20 73  xprUnmap() and s
8950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8960: 28 29 20 6f 6e 20 74 68 65 0a 2a 2a 20 65 78 70  () on the.** exp
8970: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ression..*/.void
8980: 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e 6d 61   sqlite3ExprUnma
8990: 70 41 6e 64 44 65 6c 65 74 65 28 50 61 72 73 65  pAndDelete(Parse
89a0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
89b0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
89c0: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
89d0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
89e0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78   sqlite3RenameEx
89f0: 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  prUnmap(pParse, 
8a00: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
8a10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8a20: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  N(pParse->db, p)
8a30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8a40: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8a50: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
8a60: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
8a70: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
8a80: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
8a90: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
8aa0: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
8ab0: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
8ac0: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
8ad0: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
8ae0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8af0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
8b00: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
8b10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8b20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8b30: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8b40: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
8b50: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
8b60: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8b70: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
8b80: 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  d) ) return EXPR
8b90: 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20  _REDUCEDSIZE;.  
8ba0: 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c  return EXPR_FULL
8bb0: 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  SIZE;.}../*.** C
8bc0: 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  opy the complete
8bd0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 45   content of an E
8be0: 78 70 72 20 6e 6f 64 65 2c 20 74 61 6b 69 6e 67  xpr node, taking
8bf0: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
8c00: 64 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e  d.** past the en
8c10: 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
8c20: 72 65 20 66 6f 72 20 61 20 72 65 64 75 63 65 64  re for a reduced
8c30: 2d 73 69 7a 65 20 76 65 72 73 69 6f 6e 20 6f 66  -size version of
8c40: 20 74 68 65 20 73 6f 75 72 63 65 0a 2a 2a 20 45   the source.** E
8c50: 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  xpr..*/.static v
8c60: 6f 69 64 20 65 78 70 72 4e 6f 64 65 43 6f 70 79  oid exprNodeCopy
8c70: 28 45 78 70 72 20 2a 70 44 65 73 74 2c 20 45 78  (Expr *pDest, Ex
8c80: 70 72 20 2a 70 53 72 63 29 7b 0a 20 20 6d 65 6d  pr *pSrc){.  mem
8c90: 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 73 69  set(pDest, 0, si
8ca0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
8cb0: 65 6d 63 70 79 28 70 44 65 73 74 2c 20 70 53 72  emcpy(pDest, pSr
8cc0: 63 2c 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  c, exprStructSiz
8cd0: 65 28 70 53 72 63 29 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pSrc));.}../*.
8ce0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8cf0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8d00: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8d10: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8d20: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8d30: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8d40: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8d50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8d60: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
8d70: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
8d80: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
8d90: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
8da0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8db0: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8dc0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8dd0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8de0: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8df0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8e00: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8e10: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8e20: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8e30: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8e40: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8e50: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
8e60: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
8eb0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8ec0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8ed0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8ee0: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8ef0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8f00: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8f10: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8f20: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8f30: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8f40: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8f50: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
8f60: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
8f70: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
8f80: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
8f90: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
8fa0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
8fb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8fc0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8fd0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8fe0: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8ff0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
9000: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
9010: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
9020: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
9030: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
9040: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
9050: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
9060: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
9070: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
9080: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
9090: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
90a0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
90b0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
90c0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
90d0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
90e0: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
90f0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9100: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
9110: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
9120: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
9130: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
9140: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
9150: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
9160: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
9170: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
9180: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
9190: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
91a0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
91b0: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
91c0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
91d0: 20 74 68 65 20 45 78 70 72 20 6f 62 6a 65 63 74   the Expr object
91e0: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
91f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
9200: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
9210: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
9220: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
9230: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
9240: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
9250: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
9260: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
9270: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
9280: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
9290: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
92a0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
92b0: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
92c0: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
92d0: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
92e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
92f0: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
9300: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
9310: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
9320: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9330: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
9340: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
9350: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
9360: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9370: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
9380: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9390: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
93a0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
93b0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
93c0: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
93d0: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
93e0: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
93f0: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
9400: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
9410: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
9420: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
9430: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
9440: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
9450: 6c 61 67 73 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  lags || p->op==T
9460: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
9470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9480: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
9490: 20 20 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f     || ExprHasPro
94a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
94b0: 75 6e 63 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b  unc).#endif.  ){
94c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
94d0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
94e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
94f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9500: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
9510: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
9520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
9530: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9540: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
9550: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
9560: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9570: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
9580: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
9590: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
95a0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
95b0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
95c0: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
95d0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
95e0: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
95f0: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
9600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9610: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
9620: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
9630: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
9640: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
9650: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
9660: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
9670: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
9680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9690: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
96a0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
96b0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
96c0: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
96d0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
96e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
96f0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
9700: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
9710: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
9720: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9730: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
9740: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
9750: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
9760: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
9770: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
9780: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
9790: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
97a0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
97b0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
97c0: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
97d0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
97e0: 33 30 4e 4e 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  30NN(p->u.zToken
97f0: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
9800: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
9810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9820: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9830: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9840: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
9850: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
9860: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
9870: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9880: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
9890: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
98a0: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
98b0: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
98c0: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
98d0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
98e0: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
98f0: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
9900: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
9910: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
9920: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
9930: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
9940: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
9950: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
9960: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
9970: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
9980: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
9990: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
99a0: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
99b0: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
99c0: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
99d0: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
99e0: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
99f0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
9a00: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
9a10: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
9a20: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
9a30: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
9a40: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
9a50: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
9a60: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
9a70: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
9a80: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
9a90: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
9aa0: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
9ab0: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
9ac0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
9ad0: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
9ae0: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
9af0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
9b00: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
9b10: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
9b20: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
9b30: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
9b40: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
9b50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9b60: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
9b70: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9b80: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
9b90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9ba0: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
9bb0: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
9bc0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
9bd0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
9be0: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
9bf0: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
9c00: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
9c10: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
9c20: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
9c30: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
9c40: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
9c50: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
9c60: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
9c70: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
9c80: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
9c90: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
9ca0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9cb0: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
9cc0: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
9cd0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
9ce0: 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  * portion of the
9cf0: 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69   buffer copied i
9d00: 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63  nto by this func
9d10: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
9d20: 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71  Expr *exprDup(sq
9d30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
9d40: 2a 70 2c 20 69 6e 74 20 64 75 70 46 6c 61 67 73  *p, int dupFlags
9d50: 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29  , u8 **pzBuffer)
9d60: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  {.  Expr *pNew; 
9d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
9d80: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9d90: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20    u8 *zAlloc;   
9da0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9db0: 79 20 73 70 61 63 65 20 66 72 6f 6d 20 77 68 69  y space from whi
9dc0: 63 68 20 74 6f 20 62 75 69 6c 64 20 45 78 70 72  ch to build Expr
9dd0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
9de0: 20 73 74 61 74 69 63 46 6c 61 67 3b 20 20 20 20   staticFlag;    
9df0: 20 20 20 2f 2a 20 45 50 5f 53 74 61 74 69 63 20     /* EP_Static 
9e00: 69 66 20 73 70 61 63 65 20 6e 6f 74 20 6f 62 74  if space not obt
9e10: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
9e20: 63 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  c */..  assert( 
9e30: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
9e40: 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
9e50: 28 20 64 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c  ( dupFlags==0 ||
9e60: 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44   dupFlags==EXPRD
9e70: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
9e80: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
9e90: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9ea0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9eb0: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
9ec0: 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74  ut where to writ
9ed0: 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73  e the new Expr s
9ee0: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69  tructure. */.  i
9ef0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
9f00: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
9f10: 75 66 66 65 72 3b 0a 20 20 20 20 73 74 61 74 69  uffer;.    stati
9f20: 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69  cFlag = EP_Stati
9f30: 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
9f40: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
9f50: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9f60: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
9f70: 70 2c 20 64 75 70 46 6c 61 67 73 29 29 3b 0a 20  p, dupFlags));. 
9f80: 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20     staticFlag = 
9f90: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  0;.  }.  pNew = 
9fa0: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
9fb0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
9fc0: 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69     /* Set nNewSi
9fd0: 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  ze to the size a
9fe0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
9ff0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
a000: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20  ed to.    ** by 
a010: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
a020: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
a030: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
a040: 53 49 5a 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45  SIZE or.    ** E
a050: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
a060: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
a070: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a080: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
a090: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63  .    ** by the c
a0a0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
a0b0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
a0c0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
a0d0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
a0e0: 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20  d nStructSize = 
a0f0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
a100: 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29  ize(p, dupFlags)
a110: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
a120: 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75  nNewSize = nStru
a130: 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a  ctSize & 0xfff;.
a140: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
a150: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
a160: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
a170: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
a180: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
a190: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
a1a0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
a1b0: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
a1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f  }else{.      nTo
a1d0: 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ken = 0;.    }. 
a1e0: 20 20 20 69 66 28 20 64 75 70 46 6c 61 67 73 20     if( dupFlags 
a1f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a200: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a210: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d  (p, EP_Reduced)=
a220: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 );.      memc
a230: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
a240: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  ewSize);.    }el
a250: 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 53  se{.      u32 nS
a260: 69 7a 65 20 3d 20 28 75 33 32 29 65 78 70 72 53  ize = (u32)exprS
a270: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
a280: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
a290: 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  c, p, nSize);.  
a2a0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58      if( nSize<EX
a2b0: 50 52 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a  PR_FULLSIZE ){ .
a2c0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
a2d0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
a2e0: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
a2f0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
a300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
a310: 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64  t the EP_Reduced
a320: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20  , EP_TokenOnly, 
a330: 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c  and EP_Static fl
a340: 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ags appropriatel
a350: 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  y. */.    pNew->
a360: 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65  flags &= ~(EP_Re
a370: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
a380: 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50 5f  ly|EP_Static|EP_
a390: 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70  MemToken);.    p
a3a0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53  New->flags |= nS
a3b0: 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f  tructSize & (EP_
a3c0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
a3d0: 4f 6e 6c 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Only);.    pNew-
a3e0: 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63  >flags |= static
a3f0: 46 6c 61 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  Flag;..    /* Co
a400: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
a410: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
a420: 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  y. */.    if( nT
a430: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  oken ){.      ch
a440: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
a450: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
a460: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
a470: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65  wSize];.      me
a480: 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e  mcpy(zToken, p->
a490: 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  u.zToken, nToken
a4a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
a4b0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
a4c0: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28  pNew->flags) & (
a4d0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
a4e0: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 20 20  Leaf)) ){.      
a4f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
a500: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
a510: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
a520: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
a530: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
a540: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
a550: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
a560: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
a570: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a580: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
a590: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
a5a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a5b0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
a5c0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a5d0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
a5e0: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
a5f0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
a600: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
a610: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
a620: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
a630: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
a640: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
a650: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
a660: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 57 69 6e 46  okenOnly|EP_WinF
a670: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  unc) ){.      zA
a680: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
a690: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
a6a0: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
a6b0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
a6c0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 54 6f 6b 65  ty(pNew, EP_Toke
a6d0: 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29  nOnly|EP_Leaf) )
a6e0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
a6f0: 70 4c 65 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74  pLeft = p->pLeft
a700: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
a710: 20 20 20 20 20 20 20 20 20 65 78 70 72 44 75 70           exprDup
a720: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
a730: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
a740: 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20  zAlloc) : 0;.   
a750: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
a760: 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a  t = p->pRight ?.
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64         exprDup(d
a790: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 45 58  b, p->pRight, EX
a7a0: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
a7b0: 41 6c 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20  Alloc) : 0;.    
a7c0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a7d0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
a7e0: 4e 43 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  NC.      if( Exp
a7f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
a800: 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
a810: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70         pNew->y.p
a820: 57 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  Win = sqlite3Win
a830: 64 6f 77 44 75 70 28 64 62 2c 20 70 4e 65 77 2c  dowDup(db, pNew,
a840: 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a 20 20 20   p->y.pWin);.   
a850: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
a860: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
a870: 77 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  w, EP_WinFunc) )
a880: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
a890: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
a8a0: 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20  WINDOWFUNC */.  
a8b0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
a8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
a8d0: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
a8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
a8f0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
a900: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
a910: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
a920: 5f 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  _Leaf) ){.      
a930: 20 20 69 66 28 20 70 4e 65 77 2d 3e 6f 70 3d 3d    if( pNew->op==
a940: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
a950: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a960: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e 70  ew->pLeft = p->p
a970: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
a980: 61 73 73 65 72 74 28 20 70 2d 3e 69 43 6f 6c 75  assert( p->iColu
a990: 6d 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  mn==0 || p->pRig
a9a0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
a9b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
a9c0: 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d 3e 70  ight==0  || p->p
a9d0: 52 69 67 68 74 3d 3d 70 2d 3e 70 4c 65 66 74 20  Right==p->pLeft 
a9e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
aa00: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
aa10: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
aa20: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
aa30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
aa40: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
aa50: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
aa60: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
aa70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aa80: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
aa90: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
aaa0: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
aab0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
aac0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
aad0: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
aae0: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
aaf0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
ab00: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
ab10: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
ab20: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
ab30: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
ab40: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ab50: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
ab60: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
ab70: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
ab80: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
ab90: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
aba0: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
abb0: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
abc0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
abd0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
abe0: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
abf0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
ac00: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
ac10: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
ac20: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
ac30: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
ac40: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
ac50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ac60: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
ac70: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
ac80: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
ac90: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
aca0: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
acb0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
acc0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
acd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ace0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
acf0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
ad00: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
ad10: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
ad20: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
ad30: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
ad40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
ad50: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
ad60: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
ad70: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
ad80: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
ad90: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
ada0: 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 61 74  NC./*.** The gat
adb0: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
adc0: 28 29 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64  () procedure and
add0: 20 69 74 73 20 68 65 6c 70 65 72 20 72 6f 75 74   its helper rout
ade0: 69 6e 65 0a 2a 2a 20 67 61 74 68 65 72 53 65 6c  ine.** gatherSel
adf0: 65 63 74 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61  ectWindowsCallba
ae00: 63 6b 28 29 20 61 72 65 20 75 73 65 64 20 74 6f  ck() are used to
ae10: 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 65 78   scan all the ex
ae20: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 6e 20  pressions.** an 
ae30: 61 20 6e 65 77 6c 79 20 64 75 70 6c 69 63 61 74  a newly duplicat
ae40: 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ed SELECT statem
ae50: 65 6e 74 20 61 6e 64 20 67 61 74 68 65 72 20 61  ent and gather a
ae60: 6c 6c 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77  ll of the Window
ae70: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 66 6f 75 6e  .** objects foun
ae80: 64 20 74 68 65 72 65 2c 20 61 73 73 65 6d 62 6c  d there, assembl
ae90: 69 6e 67 20 74 68 65 6d 20 6f 6e 74 6f 20 74 68  ing them onto th
aea0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 61 74  e linked list at
aeb0: 20 53 65 6c 65 63 74 2d 3e 70 57 69 6e 2e 0a 2a   Select->pWin..*
aec0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74  /.static int gat
aed0: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
aee0: 43 61 6c 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20  Callback(Walker 
aef0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
af00: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
af10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
af20: 54 49 4f 4e 20 26 26 20 70 45 78 70 72 2d 3e 79  TION && pExpr->y
af30: 2e 70 57 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  .pWin!=0 ){.    
af40: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
af50: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
af60: 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b 0a 20 20  P_WinFunc) );.  
af70: 20 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d    pExpr->y.pWin-
af80: 3e 70 4e 65 78 74 57 69 6e 20 3d 20 70 57 61 6c  >pNextWin = pWal
af90: 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e  ker->u.pSelect->
afa0: 70 57 69 6e 3b 0a 20 20 20 20 70 57 61 6c 6b 65  pWin;.    pWalke
afb0: 72 2d 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70 57  r->u.pSelect->pW
afc0: 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57  in = pExpr->y.pW
afd0: 69 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  in;.  }.  return
afe0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
aff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 61 74 68  .static int gath
b000: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 53  erSelectWindowsS
b010: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 28 57 61  electCallback(Wa
b020: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
b030: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65 74  elect *p){.  ret
b040: 75 72 6e 20 70 3d 3d 70 57 61 6c 6b 65 72 2d 3e  urn p==pWalker->
b050: 75 2e 70 53 65 6c 65 63 74 20 3f 20 57 52 43 5f  u.pSelect ? WRC_
b060: 43 6f 6e 74 69 6e 75 65 20 3a 20 57 52 43 5f 50  Continue : WRC_P
b070: 72 75 6e 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  rune;.}.static v
b080: 6f 69 64 20 67 61 74 68 65 72 53 65 6c 65 63 74  oid gatherSelect
b090: 57 69 6e 64 6f 77 73 28 53 65 6c 65 63 74 20 2a  Windows(Select *
b0a0: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
b0b0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
b0c0: 6b 20 3d 20 67 61 74 68 65 72 53 65 6c 65 63 74  k = gatherSelect
b0d0: 57 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 3b  WindowsCallback;
b0e0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b0f0: 62 61 63 6b 20 3d 20 67 61 74 68 65 72 53 65 6c  back = gatherSel
b100: 65 63 74 57 69 6e 64 6f 77 73 53 65 6c 65 63 74  ectWindowsSelect
b110: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53  Callback;.  w.xS
b120: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
b130: 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d   0;.  w.pParse =
b140: 20 30 3b 0a 20 20 77 2e 75 2e 70 53 65 6c 65 63   0;.  w.u.pSelec
b150: 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
b160: 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
b170: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
b180: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
b190: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
b1a0: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
b1b0: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
b1c0: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
b1d0: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
b1e0: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
b1f0: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
b200: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
b210: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
b220: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
b230: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
b240: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
b250: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
b260: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
b270: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
b280: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
b290: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
b2a0: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
b2b0: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
b2c0: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
b2d0: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
b2e0: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
b2f0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
b300: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
b310: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
b320: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
b330: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
b340: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
b350: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
b360: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
b370: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
b380: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
b390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
b3a0: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
b3b0: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
b3c0: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
b3d0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
b3e0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
b3f0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
b400: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
b410: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
b420: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
b430: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
b440: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
b450: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
b460: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
b470: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
b480: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
b490: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
b4a0: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
b4b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
b4c0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
b4d0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
b4e0: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
b4f0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
b500: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
b510: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
b520: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
b530: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
b540: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
b550: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
b560: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
b570: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
b580: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
b590: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
b5a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
b5b0: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
b5c0: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
b5d0: 2a 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c  *pPriorSelectCol
b5e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
b5f0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
b600: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b610: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
b620: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b630: 2c 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  , sqlite3DbMallo
b640: 63 53 69 7a 65 28 64 62 2c 20 70 29 29 3b 0a 20  cSize(db, p));. 
b650: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b660: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b670: 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70  >nExpr = p->nExp
b680: 72 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 4e 65  r;.  pItem = pNe
b690: 77 2d 3e 61 3b 0a 20 20 70 4f 6c 64 49 74 65 6d  w->a;.  pOldItem
b6a0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
b6b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
b6c0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
b6d0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
b6e0: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
b6f0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
b700: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
b710: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
b720: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
b730: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45  xprDup(db, pOldE
b740: 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  xpr, flags);.   
b750: 20 69 66 28 20 70 4f 6c 64 45 78 70 72 20 0a 20   if( pOldExpr . 
b760: 20 20 20 20 26 26 20 70 4f 6c 64 45 78 70 72 2d      && pOldExpr-
b770: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
b780: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 28 70  OLUMN.     && (p
b790: 4e 65 77 45 78 70 72 20 3d 20 70 49 74 65 6d 2d  NewExpr = pItem-
b7a0: 3e 70 45 78 70 72 29 21 3d 30 20 0a 20 20 20 20  >pExpr)!=0 .    
b7b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b7c0: 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75   pNewExpr->iColu
b7d0: 6d 6e 3d 3d 30 20 7c 7c 20 69 3e 30 20 29 3b 0a  mn==0 || i>0 );.
b7e0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 45 78        if( pNewEx
b7f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29  pr->iColumn==0 )
b800: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b810: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 70 4c 65 66  ( pOldExpr->pLef
b820: 74 3d 3d 70 4f 6c 64 45 78 70 72 2d 3e 70 52 69  t==pOldExpr->pRi
b830: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ght );.        p
b840: 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 20 3d  PriorSelectCol =
b850: 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74   pNewExpr->pLeft
b860: 20 3d 20 70 4e 65 77 45 78 70 72 2d 3e 70 52 69   = pNewExpr->pRi
b870: 67 68 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ght;.      }else
b880: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b890: 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( i>0 );.       
b8a0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 5b 2d   assert( pItem[-
b8b0: 31 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  1].pExpr!=0 );. 
b8c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b8d0: 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  NewExpr->iColumn
b8e0: 3d 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70  ==pItem[-1].pExp
b8f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a  r->iColumn+1 );.
b900: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b910: 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3d  pPriorSelectCol=
b920: 3d 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72  =pItem[-1].pExpr
b930: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
b940: 20 20 20 70 4e 65 77 45 78 70 72 2d 3e 70 4c 65     pNewExpr->pLe
b950: 66 74 20 3d 20 70 50 72 69 6f 72 53 65 6c 65 63  ft = pPriorSelec
b960: 74 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tCol;.      }.  
b970: 20 20 7d 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a    }.    pItem->z
b980: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
b990: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
b9a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
b9b0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
b9c0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b9d0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
b9e0: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
b9f0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
ba00: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
ba10: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
ba20: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
ba30: 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70  ->bSpanIsTab = p
ba40: 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73  OldItem->bSpanIs
ba50: 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Tab;.    pItem->
ba60: 62 53 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c  bSorterRef = pOl
ba70: 64 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  dItem->bSorterRe
ba80: 66 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20  f;.    pItem->u 
ba90: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20  = pOldItem->u;. 
baa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
bab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
bac0: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
bad0: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
bae0: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
baf0: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
bb00: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
bb10: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
bb20: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
bb30: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
bb40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
bb50: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
bb60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bb70: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
bb80: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
bb90: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
bba0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
bbb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
bbc0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
bbd0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
bbe0: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
bbf0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
bc00: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
bc10: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
bc20: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
bc30: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
bc40: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
bc50: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
bc60: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
bc70: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bc80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bc90: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
bca0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
bcb0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
bcc0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
bcd0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
bce0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
bcf0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
bd00: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
bd10: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
bd20: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
bd30: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
bd40: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
bd50: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
bd60: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
bd70: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
bd80: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
bd90: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
bda0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
bdb0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
bdc0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
bdd0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
bde0: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
bdf0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
be00: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
be10: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
be20: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
be30: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
be40: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
be50: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
be60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
be70: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
be80: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
be90: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
bea0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
beb0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
bec0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
bed0: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
bee0: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
bef0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
bf00: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
bf10: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
bf20: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
bf30: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
bf40: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
bf50: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
bf60: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
bf70: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
bf80: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
bf90: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
bfa0: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
bfb0: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
bfc0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
bfd0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
bfe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
bff0: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
c000: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
c010: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
c020: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
c030: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
c040: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
c050: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
c060: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c070: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c080: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
c090: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
c0a0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
c0b0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
c0c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
c0d0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
c0e0: 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
c0f0: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
c100: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
c110: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
c120: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  , pOldItem->pSel
c130: 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ect, flags);.   
c140: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
c150: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c160: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
c170: 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  n, flags);.    p
c180: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
c190: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
c1a0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
c1b0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
c1c0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
c1d0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
c1e0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
c1f0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
c200: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
c210: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
c220: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
c230: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
c240: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
c250: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
c260: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c270: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
c280: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c290: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
c2a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
c2b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
c2c0: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
c2d0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
c2e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c2f0: 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  NN(db, p->nId*si
c300: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
c310: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
c320: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c330: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65  DbFreeNN(db, pNe
c340: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
c350: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
c360: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
c370: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
c380: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
c390: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
c3a0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
c3b0: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
c3c0: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
c3d0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
c3e0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
c3f0: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
c400: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
c410: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
c420: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
c430: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
c440: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
c450: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
c460: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
c470: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
c480: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
c490: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
c4a0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
c4b0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
c4c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
c4d0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
c4e0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
c4f0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
c500: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
c510: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
c520: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
c530: 70 44 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  pDup, int flags)
c540: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74  {.  Select *pRet
c550: 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
c560: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c  pNext = 0;.  Sel
c570: 65 63 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  ect **pp = &pRet
c580: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a  ;.  Select *p;..
c590: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
c5a0: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b  );.  for(p=pDup;
c5b0: 20 70 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29   p; p=p->pPrior)
c5c0: 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
c5d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c5e0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
c5f0: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20  zeof(*p) );.    
c600: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72  if( pNew==0 ) br
c610: 65 61 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  eak;.    pNew->p
c620: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
c630: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c640: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
c650: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63  ;.    pNew->pSrc
c660: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
c670: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
c680: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
c690: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
c6a0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c6b0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
c6c0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72  );.    pNew->pGr
c6d0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
c6e0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
c6f0: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67  ->pGroupBy, flag
c700: 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48  s);.    pNew->pH
c710: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
c720: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
c730: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
c740: 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
c750: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
c760: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
c770: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
c780: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70      pNew->op = p
c790: 2d 3e 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ->op;.    pNew->
c7a0: 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pNext = pNext;. 
c7b0: 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
c7c0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
c7d0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
c7e0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
c7f0: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
c800: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
c810: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f   0;.    pNew->iO
c820: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
c830: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
c840: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
c850: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
c860: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c870: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
c880: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  .    pNew->addrO
c890: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
c8a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65  .    pNew->nSele
c8b0: 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65  ctRow = p->nSele
c8c0: 63 74 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  ctRow;.    pNew-
c8d0: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
c8e0: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
c8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c900: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
c910: 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20     pNew->pWin = 
c920: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69  0;.    pNew->pWi
c930: 6e 44 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57  nDefn = sqlite3W
c940: 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c  indowListDup(db,
c950: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
c960: 20 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29     if( p->pWin )
c970: 20 67 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e   gatherSelectWin
c980: 64 6f 77 73 28 70 4e 65 77 29 3b 0a 23 65 6e 64  dows(pNew);.#end
c990: 69 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c  if.    pNew->sel
c9a0: 49 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20  Id = p->selId;. 
c9b0: 20 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20     *pp = pNew;. 
c9c0: 20 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70     pp = &pNew->p
c9d0: 50 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74  Prior;.    pNext
c9e0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
c9f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
ca00: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
ca10: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
ca20: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
ca30: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
ca40: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
ca50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
ca60: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
ca70: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
ca80: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
ca90: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
caa0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
cab0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
cac0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
cad0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
cae0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  n list..**.** Th
caf0: 65 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74  e pList argument
cb00: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
cb10: 4e 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65  NULL or a pointe
cb20: 72 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74  r to an ExprList
cb30: 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
cb40: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
cb50: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  o sqlite3ExprLis
cb60: 74 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73  tAppend().  This
cb70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20   routine.** may 
cb80: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
cb90: 20 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74   an ExprList obt
cba0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
cbb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e  e3ExprListDup().
cbc0: 0a 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69  .** Reason:  Thi
cbd0: 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65  s routine assume
cbe0: 73 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  s that the numbe
cbf0: 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c  r of slots in pL
cc00: 69 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61  ist->a[].** is a
cc10: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20   power of two.  
cc20: 54 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72  That is true for
cc30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cc40: 41 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73  Append() returns
cc50: 0a 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e  .** but is not n
cc60: 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20  ecessarily true 
cc70: 66 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20  from the return 
cc80: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
cc90: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a  ExprListDup()..*
cca0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
ccb0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
ccc0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
ccd0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
cce0: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
ccf0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
cd00: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
cd10: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
cd20: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
cd30: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
cd40: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
cd50: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
cd60: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
cd70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
cd80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cd90: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
cda0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cdb0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
cdc0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
cdd0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
cde0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
cdf0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
ce00: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
ce10: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
ce20: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
ce30: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
ce40: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
ce50: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
ce60: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
ce70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ce80: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ce90: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
cea0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
ceb0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
cec0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
ced0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
cee0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
cef0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
cf00: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
cf10: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a  ist->nExpr = 0;.
cf20: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
cf30: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
cf40: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
cf50: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cf60: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77   *pNew;.    pNew
cf70: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
cf80: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a  loc(db, pList, .
cf90: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
cfa0: 2a 70 4c 69 73 74 29 2b 28 32 2a 28 73 71 6c 69  *pList)+(2*(sqli
cfb0: 74 65 33 5f 69 6e 74 36 34 29 70 4c 69 73 74 2d  te3_int64)pList-
cfc0: 3e 6e 45 78 70 72 2d 31 29 2a 73 69 7a 65 6f 66  >nExpr-1)*sizeof
cfd0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
cfe0: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
cff0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
d000: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
d010: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
d020: 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
d030: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
d040: 70 72 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28  pr++];.  assert(
d050: 20 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74   offsetof(struct
d060: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d070: 4e 61 6d 65 29 3d 3d 73 69 7a 65 6f 66 28 70 49  Name)==sizeof(pI
d080: 74 65 6d 2d 3e 70 45 78 70 72 29 20 29 3b 0a 20  tem->pExpr) );. 
d090: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
d0a0: 66 28 73 74 72 75 63 74 20 45 78 70 72 4c 69 73  f(struct ExprLis
d0b0: 74 5f 69 74 65 6d 2c 70 45 78 70 72 29 3d 3d 30  t_item,pExpr)==0
d0c0: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 49   );.  memset(&pI
d0d0: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 30 2c 73 69 7a  tem->zName,0,siz
d0e0: 65 6f 66 28 2a 70 49 74 65 6d 29 2d 6f 66 66 73  eof(*pItem)-offs
d0f0: 65 74 6f 66 28 73 74 72 75 63 74 20 45 78 70 72  etof(struct Expr
d100: 4c 69 73 74 5f 69 74 65 6d 2c 7a 4e 61 6d 65 29  List_item,zName)
d110: 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  );.  pItem->pExp
d120: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 72 65 74  r = pExpr;.  ret
d130: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
d140: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
d150: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
d160: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
d170: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
d180: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d190: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
d1a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
d1b0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
d1c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d1d0: 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 73 20 61 6e  *.** pColumns an
d1e0: 64 20 70 45 78 70 72 20 66 6f 72 6d 20 61 20 76  d pExpr form a v
d1f0: 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e 74  ector assignment
d200: 20 77 68 69 63 68 20 69 73 20 70 61 72 74 20 6f   which is part o
d210: 66 20 74 68 65 20 53 45 54 0a 2a 2a 20 63 6c 61  f the SET.** cla
d220: 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45  use of an UPDATE
d230: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4c 69 6b   statement.  Lik
d240: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
d250: 20 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28       (a,b,c) = (
d260: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
d270: 33 29 0a 2a 2a 20 4f 72 3a 20 20 20 20 28 61 2c  3).** Or:    (a,
d280: 62 2c 63 29 20 3d 20 28 53 45 4c 45 43 54 20 78  b,c) = (SELECT x
d290: 2c 79 2c 7a 20 46 52 4f 4d 20 2e 2e 2e 2e 29 0a  ,y,z FROM ....).
d2a0: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 74  **.** For each t
d2b0: 65 72 6d 20 6f 66 20 74 68 65 20 76 65 63 74 6f  erm of the vecto
d2c0: 72 20 61 73 73 69 67 6e 6d 65 6e 74 2c 20 61 70  r assignment, ap
d2d0: 70 65 6e 64 20 6e 65 77 20 65 6e 74 72 69 65 73  pend new entries
d2e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   to the.** expre
d2f0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
d300: 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  .  In the case o
d310: 66 20 61 20 73 75 62 71 75 65 72 79 20 6f 6e 20  f a subquery on 
d320: 74 68 65 20 52 48 53 2c 20 61 70 70 65 6e 64 0a  the RHS, append.
d330: 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  ** TK_SELECT_COL
d340: 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  UMN expressions.
d350: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
d360: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d370: 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50 61 72  endVector(.  Par
d380: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d390: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
d3a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d3b0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d3c0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
d3d0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
d3e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d3f0: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
d400: 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ns,      /* List
d410: 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c 48 53   of names of LHS
d420: 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e 6d 65   of the assignme
d430: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  nt */.  Expr *pE
d440: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
d450: 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65 73 73  * Vector express
d460: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
d470: 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  ed. Might be NUL
d480: 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  L */.){.  sqlite
d490: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d4a0: 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  db;.  int n;.  i
d4b0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 46 69 72  nt i;.  int iFir
d4c0: 73 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  st = pList ? pLi
d4d0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
d4e0: 20 2f 2a 20 70 43 6f 6c 75 6d 6e 73 20 63 61 6e   /* pColumns can
d4f0: 20 6f 6e 6c 79 20 62 65 20 4e 55 4c 4c 20 64 75   only be NULL du
d500: 65 20 74 6f 20 61 6e 20 4f 4f 4d 20 62 75 74 20  e to an OOM but 
d510: 61 6e 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  an OOM will caus
d520: 65 20 61 6e 0a 20 20 2a 2a 20 65 78 69 74 20 70  e an.  ** exit p
d530: 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
d540: 74 69 6e 65 20 62 65 69 6e 67 20 69 6e 76 6f 6b  tine being invok
d550: 65 64 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  ed */.  if( NEVE
d560: 52 28 70 43 6f 6c 75 6d 6e 73 3d 3d 30 29 20 29  R(pColumns==0) )
d570: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
d580: 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  end_error;.  if(
d590: 20 70 45 78 70 72 3d 3d 30 20 29 20 67 6f 74 6f   pExpr==0 ) goto
d5a0: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
d5b0: 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rror;..  /* If t
d5c0: 68 65 20 52 48 53 20 69 73 20 61 20 76 65 63 74  he RHS is a vect
d5d0: 6f 72 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  or, then we can 
d5e0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 63 68 65 63  immediately chec
d5f0: 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 0a 20  k to see that . 
d600: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
d610: 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53 20  the RHS and LHS 
d620: 6d 61 74 63 68 2e 20 20 42 75 74 20 69 66 20 74  match.  But if t
d630: 68 65 20 52 48 53 20 69 73 20 61 20 53 45 4c 45  he RHS is a SELE
d640: 43 54 2c 20 0a 20 20 2a 2a 20 77 69 6c 64 63 61  CT, .  ** wildca
d650: 72 64 73 20 28 22 2a 22 29 20 69 6e 20 74 68 65  rds ("*") in the
d660: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d670: 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74 20 62  he SELECT must b
d680: 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
d690: 65 0a 20 20 2a 2a 20 77 65 20 63 61 6e 20 64 6f  e.  ** we can do
d6a0: 20 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 2c   the size check,
d6b0: 20 73 6f 20 64 65 66 65 72 20 74 68 65 20 73 69   so defer the si
d6c0: 7a 65 20 63 68 65 63 6b 20 75 6e 74 69 6c 20 63  ze check until c
d6d0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ode generation..
d6e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
d6f0: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
d700: 26 26 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64  && pColumns->nId
d710: 21 3d 28 6e 3d 73 71 6c 69 74 65 33 45 78 70 72  !=(n=sqlite3Expr
d720: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
d730: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
d740: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d750: 2c 20 22 25 64 20 63 6f 6c 75 6d 6e 73 20 61 73  , "%d columns as
d760: 73 69 67 6e 65 64 20 25 64 20 76 61 6c 75 65 73  signed %d values
d770: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d780: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d         pColumns-
d790: 3e 6e 49 64 2c 20 6e 29 3b 0a 20 20 20 20 67 6f  >nId, n);.    go
d7a0: 74 6f 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  to vector_append
d7b0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 66  _error;.  }..  f
d7c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
d7d0: 6e 73 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  ns->nId; i++){. 
d7e0: 20 20 20 45 78 70 72 20 2a 70 53 75 62 45 78 70     Expr *pSubExp
d7f0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  r = sqlite3ExprF
d800: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 50  orVectorField(pP
d810: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 29 3b  arse, pExpr, i);
d820: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d830: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d840: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
d850: 2c 20 70 53 75 62 45 78 70 72 29 3b 0a 20 20 20  , pSubExpr);.   
d860: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
d870: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
d880: 74 2d 3e 6e 45 78 70 72 3d 3d 69 46 69 72 73 74  t->nExpr==iFirst
d890: 2b 69 2b 31 20 29 3b 0a 20 20 20 20 20 20 70 4c  +i+1 );.      pL
d8a0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
d8b0: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70  xpr-1].zName = p
d8c0: 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e  Columns->a[i].zN
d8d0: 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f 6c 75  ame;.      pColu
d8e0: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  mns->a[i].zName 
d8f0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
d900: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
d910: 63 46 61 69 6c 65 64 20 26 26 20 70 45 78 70 72  cFailed && pExpr
d920: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
d930: 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 21  && ALWAYS(pList!
d940: 3d 30 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  =0) ){.    Expr 
d950: 2a 70 46 69 72 73 74 20 3d 20 70 4c 69 73 74 2d  *pFirst = pList-
d960: 3e 61 5b 69 46 69 72 73 74 5d 2e 70 45 78 70 72  >a[iFirst].pExpr
d970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
d980: 69 72 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  irst!=0 );.    a
d990: 73 73 65 72 74 28 20 70 46 69 72 73 74 2d 3e 6f  ssert( pFirst->o
d9a0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p==TK_SELECT_COL
d9b0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 0a 20 20 20  UMN );.     .   
d9c0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 53 45   /* Store the SE
d9d0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
d9e0: 6e 20 70 52 69 67 68 74 20 73 6f 20 69 74 20 77  n pRight so it w
d9f0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
da00: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hen.    ** sqlit
da10: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
da20: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
da30: 20 20 20 20 70 46 69 72 73 74 2d 3e 70 52 69 67      pFirst->pRig
da40: 68 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ht = pExpr;.    
da50: 70 45 78 70 72 20 3d 20 30 3b 0a 0a 20 20 20 20  pExpr = 0;..    
da60: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
da70: 73 69 7a 65 20 6f 66 20 74 68 65 20 4c 48 53 20  size of the LHS 
da80: 69 6e 20 69 54 61 62 6c 65 20 73 6f 20 74 68 61  in iTable so tha
da90: 74 20 77 65 20 63 61 6e 20 63 68 65 63 6b 20 74  t we can check t
daa0: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  hat.    ** the R
dab0: 48 53 20 61 6e 64 20 4c 48 53 20 73 69 7a 65 73  HS and LHS sizes
dac0: 20 6d 61 74 63 68 20 64 75 72 69 6e 67 20 63 6f   match during co
dad0: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 2a  de generation. *
dae0: 2f 0a 20 20 20 20 70 46 69 72 73 74 2d 3e 69 54  /.    pFirst->iT
daf0: 61 62 6c 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d  able = pColumns-
db00: 3e 6e 49 64 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f  >nId;.  }..vecto
db10: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3a 0a  r_append_error:.
db20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 55 6e 6d    sqlite3ExprUnm
db30: 61 70 41 6e 64 44 65 6c 65 74 65 28 70 50 61 72  apAndDelete(pPar
db40: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  se, pExpr);.  sq
db50: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
db60: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b  e(db, pColumns);
db70: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
db80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
db90: 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  e sort order for
dba0: 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
dbb0: 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45  t on the given E
dbc0: 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  xprList..*/.void
dbd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dbe0: 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70  SetSortOrder(Exp
dbf0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53  rList *p, int iS
dc00: 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28  ortOrder){.  if(
dc10: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
dc20: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
dc30: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
dc40: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
dc50: 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  >=0 && SQLITE_SO
dc60: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
dc70: 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20  ert( p->nExpr>0 
dc80: 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72  );.  if( iSortOr
dc90: 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73  der<0 ){.    ass
dca0: 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78  ert( p->a[p->nEx
dcb0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d  pr-1].sortOrder=
dcc0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
dcd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
dce0: 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  }.  p->a[p->nExp
dcf0: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
dd00: 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b   (u8)iSortOrder;
dd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
dd20: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
dd30: 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Name element of 
dd40: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
dd50: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
dd60: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
dd70: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
dd80: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
dd90: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
dda0: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
ddb0: 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  Name should neve
ddc0: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
ddd0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
dde0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
ddf0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
de00: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
de10: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
de20: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
de30: 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  tSetName(.  Pars
de40: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
de50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
de60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
de70: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
de80: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
de90: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
dea0: 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  span. */.  Token
deb0: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
dec0: 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65     /* Name to be
ded0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
dee0: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
def0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
df00: 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  ause the name to
df10: 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a   be dequoted */.
df20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  ){.  assert( pLi
df30: 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  st!=0 || pParse-
df40: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
df50: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
df60: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
df70: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
df80: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
df90: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
dfa0: 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
dfb0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
dfc0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
dfd0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
dfe0: 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  zName==0 );.    
dff0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
e000: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
e010: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
e020: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
e030: 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65  .    if( dequote
e040: 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74   ) sqlite3Dequot
e050: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
e060: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
e070: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
e080: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
e090: 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
e0a0: 20 28 76 6f 69 64 2a 29 70 49 74 65 6d 2d 3e 7a   (void*)pItem->z
e0b0: 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  Name, pName);.  
e0c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e0d0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
e0e0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
e0f0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
e100: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
e110: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
e120: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
e130: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
e140: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
e150: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
e160: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
e170: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
e180: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
e190: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
e1a0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
e1b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e1c0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
e1d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e1e0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
e1f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e210: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e220: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
e230: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
e240: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
e250: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
e260: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
e270: 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61  tart,     /* Sta
e280: 72 74 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a  rt of the span *
e290: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e2a0: 7a 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45  zEnd        /* E
e2b0: 6e 64 20 6f 66 20 74 68 65 20 73 70 61 6e 20 2a  nd of the span *
e2c0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
e2d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
e2e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
e2f0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
e300: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
e310: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
e320: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e330: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
e340: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e350: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
e360: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
e370: 70 72 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  pr>0 );.    sqli
e380: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
e390: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
e3a0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
e3b0: 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70  sqlite3DbSpanDup
e3c0: 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e  (db, zStart, zEn
e3d0: 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
e3e0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e3f0: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
e400: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
e410: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
e420: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
e430: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
e440: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
e450: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
e460: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
e470: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
e480: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
e490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e4a0: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
e4b0: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
e4c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
e4d0: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
e4e0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
e4f0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
e500: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
e510: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
e520: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
e530: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
e540: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
e550: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
e560: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e570: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
e580: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
e590: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
e5a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
e5b0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
e5c0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on list..*/.stat
e5d0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
e5e0: 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74  NE void exprList
e5f0: 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33  DeleteNN(sqlite3
e600: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
e610: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 20  pList){.  int i 
e620: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
e630: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e640: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
e650: 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 61 73 73   pList->a;.  ass
e660: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
e670: 72 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  r>0 );.  do{.   
e680: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
e690: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
e6a0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
e6b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
e6c0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
e6d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e6e0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
e6f0: 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 7d      pItem++;.  }
e700: 77 68 69 6c 65 28 20 2d 2d 69 3e 30 20 29 3b 0a  while( --i>0 );.
e710: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
e720: 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
e730: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e740: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
e750: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
e760: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
e770: 70 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74  pList ) exprList
e780: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69  DeleteNN(db, pLi
e790: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
e7a0: 74 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65  turn the bitwise
e7b0: 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e  -OR of all Expr.
e7c0: 66 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20  flags fields in 
e7d0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70  the given.** Exp
e7e0: 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71  rList..*/.u32 sq
e7f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61  lite3ExprListFla
e800: 67 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73  gs(const ExprLis
e810: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
e820: 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b   i;.  u32 m = 0;
e830: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
e840: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
e850: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
e860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 45 78 70  ; i++){.     Exp
e870: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
e880: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
e890: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e8a0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 6d 20 7c 3d  !=0 );.     m |=
e8b0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
e8c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d   }.  return m;.}
e8d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e8e0: 61 20 53 45 4c 45 43 54 2d 6e 6f 64 65 20 63 61  a SELECT-node ca
e8f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 65  llback for the e
e900: 78 70 72 65 73 73 69 6f 6e 20 77 61 6c 6b 65 72  xpression walker
e910: 20 74 68 61 74 0a 2a 2a 20 61 6c 77 61 79 73 20   that.** always 
e920: 22 66 61 69 6c 73 22 2e 20 20 42 79 20 22 66 61  "fails".  By "fa
e930: 69 6c 22 20 69 6e 20 74 68 69 73 20 63 61 73 65  il" in this case
e940: 2c 20 77 65 20 6d 65 61 6e 20 73 65 74 0a 2a 2a  , we mean set.**
e950: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
e960: 74 6f 20 7a 65 72 6f 20 61 6e 64 20 61 62 6f 72  to zero and abor
e970: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  t..**.** This ca
e980: 6c 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20 62  llback is used b
e990: 79 20 6d 75 6c 74 69 70 6c 65 20 65 78 70 72 65  y multiple expre
e9a0: 73 73 69 6f 6e 20 77 61 6c 6b 65 72 73 2e 0a 2a  ssion walkers..*
e9b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
e9c0: 65 63 74 57 61 6c 6b 46 61 69 6c 28 57 61 6c 6b  ectWalkFail(Walk
e9d0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
e9e0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
e9f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
ea00: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
ea10: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
ea20: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
ea30: 62 6f 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  bort;.}../*.** I
ea40: 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  f the input expr
ea50: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 49 44 20  ession is an ID 
ea60: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 22 74  with the name "t
ea70: 72 75 65 22 20 6f 72 20 22 66 61 6c 73 65 22 0a  rue" or "false".
ea80: 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  ** then convert 
ea90: 69 74 20 69 6e 74 6f 20 61 6e 20 54 4b 5f 54 52  it into an TK_TR
eaa0: 55 45 46 41 4c 53 45 20 74 65 72 6d 2e 20 20 52  UEFALSE term.  R
eab0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
eac0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 76 65 72 73  f.** the convers
ead0: 69 6f 6e 20 68 61 70 70 65 6e 65 64 2c 20 61 6e  ion happened, an
eae0: 64 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  d zero if the ex
eaf0: 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 61 6c  pression is unal
eb00: 74 65 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tered..*/.int sq
eb10: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
eb20: 65 46 61 6c 73 65 28 45 78 70 72 20 2a 70 45 78  eFalse(Expr *pEx
eb30: 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  pr){.  assert( p
eb40: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
eb50: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
eb60: 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 69 66 28  _STRING );.  if(
eb70: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
eb80: 79 28 70 45 78 70 72 2c 20 45 50 5f 51 75 6f 74  y(pExpr, EP_Quot
eb90: 65 64 29 0a 20 20 20 26 26 20 28 73 71 6c 69 74  ed).   && (sqlit
eba0: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
ebb0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65  >u.zToken, "true
ebc0: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ")==0.       || 
ebd0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
ebe0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
ebf0: 22 66 61 6c 73 65 22 29 3d 3d 30 29 0a 20 20 29  "false")==0).  )
ec00: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  {.    pExpr->op 
ec10: 3d 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3b 0a  = TK_TRUEFALSE;.
ec20: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
ec30: 72 74 79 28 70 45 78 70 72 2c 20 70 45 78 70 72  rty(pExpr, pExpr
ec40: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d 30  ->u.zToken[4]==0
ec50: 20 3f 20 45 50 5f 49 73 54 72 75 65 20 3a 20 45   ? EP_IsTrue : E
ec60: 50 5f 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20  P_IsFalse);.    
ec70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
ec80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ec90: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
eca0: 6d 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55  must be a TK_TRU
ecb0: 45 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65  EFALSE Expr node
ecc0: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69  .  Return 1 if i
ecd0: 74 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64  t is TRUE.** and
ece0: 20 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53   0 if it is FALS
ecf0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
ed00: 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
ed10: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
ed20: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45  r){.  assert( pE
ed30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45  xpr->op==TK_TRUE
ed40: 46 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72  FALSE );.  asser
ed50: 74 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  t( sqlite3StrICm
ed60: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
ed70: 6e 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20  n,"true")==0.   
ed80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74      || sqlite3St
ed90: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
eda0: 54 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d  Token,"false")==
edb0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45  0 );.  return pE
edc0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d  xpr->u.zToken[4]
edd0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ==0;.}../*.** If
ede0: 20 70 45 78 70 72 20 69 73 20 61 6e 20 41 4e 44   pExpr is an AND
edf0: 20 6f 72 20 4f 52 20 65 78 70 72 65 73 73 69 6f   or OR expressio
ee00: 6e 2c 20 74 72 79 20 74 6f 20 73 69 6d 70 6c 69  n, try to simpli
ee10: 66 79 20 69 74 20 62 79 20 65 6c 69 6d 69 6e 61  fy it by elimina
ee20: 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20 74 68  ting.** terms th
ee30: 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74 72  at are always tr
ee40: 75 65 20 6f 72 20 66 61 6c 73 65 2e 20 20 52 65  ue or false.  Re
ee50: 74 75 72 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  turn the simplif
ee60: 69 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ied expression..
ee70: 2a 2a 20 4f 72 20 72 65 74 75 72 6e 20 74 68 65  ** Or return the
ee80: 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73   original expres
ee90: 73 69 6f 6e 20 69 66 20 6e 6f 20 73 69 6d 70 6c  sion if no simpl
eea0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 70 6f 73  ification is pos
eeb0: 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  sible..**.** Exa
eec0: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
eed0: 20 28 78 3c 31 30 29 20 41 4e 44 20 74 72 75 65   (x<10) AND true
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20 20  =>   (x<10).**  
ef00: 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 66 61     (x<10) AND fa
ef10: 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
ef20: 20 20 3d 3e 20 20 20 66 61 6c 73 65 0a 2a 2a 20    =>   false.** 
ef30: 20 20 20 20 28 78 3c 31 30 29 20 41 4e 44 20 28      (x<10) AND (
ef40: 79 3d 32 32 20 4f 52 20 66 61 6c 73 65 29 20 20  y=22 OR false)  
ef50: 20 20 20 3d 3e 20 20 20 28 78 3c 31 30 29 20 41     =>   (x<10) A
ef60: 4e 44 20 28 79 3d 32 32 29 0a 2a 2a 20 20 20 20  ND (y=22).**    
ef70: 20 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32   (x<10) AND (y=2
ef80: 32 20 4f 52 20 74 72 75 65 29 20 20 20 20 20 20  2 OR true)      
ef90: 3d 3e 20 20 20 28 78 3c 31 30 29 0a 2a 2a 20 20  =>   (x<10).**  
efa0: 20 20 20 28 79 3d 32 32 29 20 4f 52 20 74 72 75     (y=22) OR tru
efb0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
efc0: 20 20 3d 3e 20 20 20 74 72 75 65 0a 2a 2f 0a 45    =>   true.*/.E
efd0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
efe0: 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28  SimplifiedAndOr(
eff0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
f000: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
f010: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   );.  if( pExpr-
f020: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 7c 7c 20 70  >op==TK_AND || p
f030: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
f040: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  ){.    Expr *pRi
f050: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
f060: 72 53 69 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72  rSimplifiedAndOr
f070: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
f080: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
f090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69   = sqlite3ExprSi
f0a0: 6d 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45  mplifiedAndOr(pE
f0b0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
f0c0: 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 54   if( ExprAlwaysT
f0d0: 72 75 65 28 70 4c 65 66 74 29 20 7c 7c 20 45 78  rue(pLeft) || Ex
f0e0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 52  prAlwaysFalse(pR
f0f0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 70  ight) ){.      p
f100: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 6f 70  Expr = pExpr->op
f110: 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70 52 69 67 68  ==TK_AND ? pRigh
f120: 74 20 3a 20 70 4c 65 66 74 3b 0a 20 20 20 20 7d  t : pLeft;.    }
f130: 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c 77  else if( ExprAlw
f140: 61 79 73 54 72 75 65 28 70 52 69 67 68 74 29 20  aysTrue(pRight) 
f150: 7c 7c 20 45 78 70 72 41 6c 77 61 79 73 46 61 6c  || ExprAlwaysFal
f160: 73 65 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  se(pLeft) ){.   
f170: 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
f180: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 3f 20 70  ->op==TK_AND ? p
f190: 4c 65 66 74 20 3a 20 70 52 69 67 68 74 3b 0a 20  Left : pRight;. 
f1a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f1b0: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pExpr;.}.../*.
f1c0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
f1d0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
f1e0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
f1f0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
f200: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
f210: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
f220: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
f230: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
f240: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
f250: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
f260: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
f270: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
f280: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
f290: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
f2a0: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
f2b0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f2c0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
f2d0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
f2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f2f0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
f310: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
f320: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
f330: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
f340: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
f350: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
f360: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
f370: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
f380: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
f390: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f3a0: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
f3b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
f3c0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
f3d0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
f3e0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
f3f0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
f400: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
f410: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
f420: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
f430: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
f440: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
f450: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
f460: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
f470: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
f480: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
f490: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
f4a0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
f4b0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
f4c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
f4d0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
f4e0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
f4f0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
f500: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
f510: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
f520: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
f530: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
f540: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
f550: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
f560: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
f570: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
f580: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
f590: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
f5a0: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
f5b0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
f5c0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
f5d0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
f5e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
f5f0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
f600: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
f610: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
f620: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
f630: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
f640: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
f650: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
f660: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
f670: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
f680: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
f690: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
f6a0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
f6b0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
f6c0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
f6d0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
f6e0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
f6f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
f700: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
f710: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
f720: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
f730: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
f740: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
f750: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
f760: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
f770: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
f780: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f790: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
f7a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f7b0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
f7c0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
f7d0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
f7e0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
f7f0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
f800: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
f810: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
f820: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
f830: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
f840: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
f850: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
f860: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
f870: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
f880: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
f890: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
f8a0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
f8b0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
f8c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
f8d0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
f8e0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
f8f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f900: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
f910: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f920: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
f930: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f940: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
f950: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f960: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
f970: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
f980: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 20  ase TK_ID:.     
f990: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 22 74 72 75   /* Convert "tru
f9a0: 65 22 20 6f 72 20 22 66 61 6c 73 65 22 20 69 6e  e" or "false" in
f9b0: 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73   a DEFAULT claus
f9c0: 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
f9d0: 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
f9e0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 6f 70 65  TK_TRUEFALSE ope
f9f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  rator */.      i
fa00: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  f( sqlite3ExprId
fa10: 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70  ToTrueFalse(pExp
fa20: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
fa30: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
fa40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
fa50: 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
fa60: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
fa70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
fa80: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
fa90: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
faa0: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
fab0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
fac0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
fad0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fae0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
faf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fb00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
fb10: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
fb20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fb30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
fb40: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
fb50: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
fb60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
fb70: 78 65 64 43 6f 6c 29 20 26 26 20 70 57 61 6c 6b  xedCol) && pWalk
fb80: 65 72 2d 3e 65 43 6f 64 65 21 3d 32 20 29 7b 0a  er->eCode!=2 ){.
fb90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
fba0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
fbb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
fbc0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33  Walker->eCode==3
fbd0: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
fbe0: 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  e==pWalker->u.iC
fbf0: 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ur ){.        re
fc00: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
fc10: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
fc20: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
fc30: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
fc40: 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 0a 20 20 20  IF_NULL_ROW:.   
fc50: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
fc60: 52 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R:.      testcas
fc70: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fc80: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
fc90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
fca0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
fcb0: 4c 4c 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20  LL_ROW );.      
fcc0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
fcd0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
fce0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
fcf0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
fd00: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
fd10: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
fd20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
fd30: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
fd40: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
fd50: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
fd60: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
fd70: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
fd80: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
fd90: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
fda0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
fdb0: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
fdc0: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
fdd0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
fde0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
fdf0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
fe00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
fe10: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
fe20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
fe30: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
fe40: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
fe50: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
fe60: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
fe70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
fe80: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
fe90: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
fea0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
feb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
fec0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
fed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
fee0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
fef0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
ff00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ff10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
ff20: 45 43 54 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65  ECT ); /* sqlite
ff30: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
ff40: 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20  ) disallows */. 
ff50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ff60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
ff70: 53 54 53 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65  STS ); /* sqlite
ff80: 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 28  3SelectWalkFail(
ff90: 29 20 64 69 73 61 6c 6c 6f 77 73 20 2a 2f 0a 20  ) disallows */. 
ffa0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
ffb0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
ffc0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
ffd0: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
ffe0: 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e  int initFlag, in
fff0: 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65  t iCur){.  Walke
10000 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  r w;.  w.eCode =
10010 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78   initFlag;.  w.x
10020 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10030 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10040 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
10050 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
10060 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
10070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10080 42 55 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  BUG.  w.xSelectC
10090 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74  allback2 = sqlit
100a0 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
100b0 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20 20 77 2e  rt2;.#endif.  w.
100c0 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  u.iCur = iCur;. 
100d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
100e0 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
100f0 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n w.eCode;.}../*
10100 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
10110 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
10120 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
10130 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10140 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
10150 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
10160 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
10170 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
10180 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
10190 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
101a0 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
101b0 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
101c0 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
101d0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
101e0 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
101f0 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
10200 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
10210 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
10220 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10230 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
10240 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
10250 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10260 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1, 0);.}../*.**
10270 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10280 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10290 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a  n non-zero if.**
102a0 0a 2a 2a 20 20 20 28 31 29 20 74 68 65 20 65 78  .**   (1) the ex
102b0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
102c0 74 61 6e 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 28  tant, and.**   (
102d0 32 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  2) the expressio
102e0 6e 20 64 6f 65 73 20 6f 72 69 67 69 6e 61 74 65  n does originate
102f0 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
10300 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
10310 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
10320 49 4e 2c 20 61 6e 64 0a 2a 2a 20 20 20 28 33 29  IN, and.**   (3)
10330 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10340 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
10350 20 61 6e 79 20 45 50 5f 46 69 78 65 64 43 6f 6c   any EP_FixedCol
10360 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20   TK_COLUMN.**   
10370 20 20 20 20 6f 70 65 72 61 6e 64 73 20 63 72 65      operands cre
10380 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e 73  ated by the cons
10390 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
103a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
103b0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
103c0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
103d0 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61 74 65  rue, it indicate
103e0 73 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  s that the expre
103f0 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ssion.** can be 
10400 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
10410 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
10420 6c 69 73 74 20 61 6e 64 20 65 76 61 6c 75 61 74  list and evaluat
10430 65 64 20 6f 6e 63 65 20 77 68 65 6e 0a 2a 2a 20  ed once when.** 
10440 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
10450 74 65 6d 65 6e 74 20 73 74 61 72 74 73 20 75 70  tement starts up
10460 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
10470 70 72 43 6f 64 65 41 74 49 6e 69 74 28 29 2e 0a  prCodeAtInit()..
10480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10490 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
104a0 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
104b0 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
104c0 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 2, 0);.}..
104d0 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
104e0 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
104f0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
10500 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
10510 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
10520 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20   for any single 
10530 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
10540 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
10550 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
10560 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ds, the.** expre
10570 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72  ssion must not r
10580 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d  efer to any non-
10590 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75  deterministic fu
105a0 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a  nction nor any.*
105b0 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  * table other th
105c0 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20  an iCur..*/.int 
105d0 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
105e0 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  leConstant(Expr 
105f0 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  *p, int iCur){. 
10600 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
10610 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b  nst(p, 3, iCur);
10620 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  .}.../*.** sqlit
10630 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
10640 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 73 71  lback used by sq
10650 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10660 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 29 2e 0a  antOrGroupBy()..
10670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
10680 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
10690 4f 72 47 72 6f 75 70 42 79 28 57 61 6c 6b 65 72  OrGroupBy(Walker
106a0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
106b0 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 4c  *pExpr){.  ExprL
106c0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
106d0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 47 72 6f 75  pWalker->u.pGrou
106e0 70 42 79 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  pBy;.  int i;.. 
106f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10700 70 72 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  pr is identical 
10710 74 6f 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20  to any GROUP BY 
10720 74 65 72 6d 2e 20 49 66 20 73 6f 2c 20 63 6f 6e  term. If so, con
10730 73 69 64 65 72 0a 20 20 2a 2a 20 69 74 20 63 6f  sider.  ** it co
10740 6e 73 74 61 6e 74 2e 20 20 2a 2f 0a 20 20 66 6f  nstant.  */.  fo
10750 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
10760 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
10770 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 47      Expr *p = pG
10780 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  roupBy->a[i].pEx
10790 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
107a0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
107b0 2c 20 70 45 78 70 72 2c 20 70 2c 20 2d 31 29 3c  , pExpr, p, -1)<
107c0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
107d0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
107e0 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
107f0 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
10800 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
10810 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28  sqlite3IsBinary(
10820 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
10830 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
10840 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
10850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
10860 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  k if pExpr is a 
10870 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 66 20 73  sub-select. If s
10880 6f 2c 20 63 6f 6e 73 69 64 65 72 20 69 74 20 76  o, consider it v
10890 61 72 69 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  ariable. */.  if
108a0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
108b0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
108c0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 57  elect) ){.    pW
108d0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
108e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
108f0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
10900 65 74 75 72 6e 20 65 78 70 72 4e 6f 64 65 49 73  eturn exprNodeIs
10910 43 6f 6e 73 74 61 6e 74 28 70 57 61 6c 6b 65 72  Constant(pWalker
10920 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
10930 2a 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72  ** Walk the expr
10940 65 73 73 69 6f 6e 20 74 72 65 65 20 70 61 73 73  ession tree pass
10950 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10960 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
10970 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 66 20   non-zero.** if 
10980 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
10990 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
109a0 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 6f 72   of constants or
109b0 20 63 6f 70 69 65 73 20 6f 66 20 74 65 72 6d 73   copies of terms
109c0 20 0a 2a 2a 20 69 6e 20 70 47 72 6f 75 70 42 79   .** in pGroupBy
109d0 20 74 68 61 74 20 73 6f 72 74 20 77 69 74 68 20   that sort with 
109e0 74 68 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61  the BINARY colla
109f0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a  tion sequence..*
10a00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10a10 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
10a20 65 72 6d 69 6e 65 20 69 66 20 61 20 74 65 72 6d  ermine if a term
10a30 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63   of the HAVING c
10a40 6c 61 75 73 65 20 63 61 6e 0a 2a 2a 20 62 65 20  lause can.** be 
10a50 70 72 6f 6d 6f 74 65 64 20 69 6e 74 6f 20 74 68  promoted into th
10a60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
10a70 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 73 75   In order for su
10a80 63 68 20 61 20 70 72 6f 6d 6f 74 69 6f 6e 20 74  ch a promotion t
10a90 6f 20 77 6f 72 6b 2c 0a 2a 2a 20 74 68 65 20 76  o work,.** the v
10aa0 61 6c 75 65 20 6f 66 20 74 68 65 20 48 41 56 49  alue of the HAVI
10ab0 4e 47 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6d  NG clause term m
10ac0 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
10ad0 66 6f 72 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  for all members 
10ae0 6f 66 0a 2a 2a 20 61 20 22 67 72 6f 75 70 22 2e  of.** a "group".
10af0 20 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e    The requiremen
10b00 74 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  t that the GROUP
10b10 20 42 59 20 74 65 72 6d 20 6d 75 73 74 20 62 65   BY term must be
10b20 20 42 49 4e 41 52 59 0a 2a 2a 20 61 73 73 75 6d   BINARY.** assum
10b30 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
10b40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10b50 6e 63 65 20 77 69 6c 6c 20 68 61 76 65 20 61 20  nce will have a 
10b60 66 69 6e 65 72 2d 67 72 61 69 6e 65 64 0a 2a 2a  finer-grained.**
10b70 20 67 72 6f 75 70 69 6e 67 20 74 68 61 6e 20 62   grouping than b
10b80 69 6e 61 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  inary.  In other
10b90 20 77 6f 72 64 73 20 28 41 3d 42 20 43 4f 4c 4c   words (A=B COLL
10ba0 41 54 45 20 62 69 6e 61 72 79 29 20 69 6d 70 6c  ATE binary) impl
10bb0 69 65 73 0a 2a 2a 20 41 3d 42 20 69 6e 20 65 76  ies.** A=B in ev
10bc0 65 72 79 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74  ery other collat
10bd0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ing sequence.  T
10be0 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74  he requirement t
10bf0 68 61 74 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  hat the.** GROUP
10c00 20 42 59 20 62 65 20 42 49 4e 41 52 59 20 69 73   BY be BINARY is
10c10 20 73 74 72 69 63 74 65 72 20 74 68 61 6e 20 6e   stricter than n
10c20 65 63 65 73 73 61 72 79 2e 20 20 49 74 20 77 6f  ecessary.  It wo
10c30 75 6c 64 20 61 6c 73 6f 20 77 6f 72 6b 0a 2a 2a  uld also work.**
10c40 20 74 6f 20 70 72 6f 6d 6f 74 65 20 48 41 56 49   to promote HAVI
10c50 4e 47 20 63 6c 61 75 73 65 73 20 74 68 61 74 20  NG clauses that 
10c60 75 73 65 20 74 68 65 20 73 61 6d 65 20 61 6c 74  use the same alt
10c70 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
10c80 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 61  ng.** sequence a
10c90 73 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  s the GROUP BY t
10ca0 65 72 6d 2c 20 62 75 74 20 74 68 61 74 20 69 73  erm, but that is
10cb0 20 6d 75 63 68 20 68 61 72 64 65 72 20 74 6f 20   much harder to 
10cc0 63 68 65 63 6b 2c 0a 2a 2a 20 61 6c 74 65 72 6e  check,.** altern
10cd0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
10ce0 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 75 6e  sequences are un
10cf0 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74 68 69 73  common, and this
10d00 20 69 73 20 6f 6e 6c 79 20 61 6e 0a 2a 2a 20 6f   is only an.** o
10d10 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 73 6f 20  ptimization, so 
10d20 77 65 20 74 61 6b 65 20 74 68 65 20 65 61 73 79  we take the easy
10d30 20 77 61 79 20 6f 75 74 20 61 6e 64 20 73 69 6d   way out and sim
10d40 70 6c 79 20 72 65 71 75 69 72 65 20 74 68 65 0a  ply require the.
10d50 2a 2a 20 47 52 4f 55 50 20 42 59 20 74 6f 20 75  ** GROUP BY to u
10d60 73 65 20 74 68 65 20 42 49 4e 41 52 59 20 63 6f  se the BINARY co
10d70 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10d90 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
10da0 47 72 6f 75 70 42 79 28 50 61 72 73 65 20 2a 70  GroupBy(Parse *p
10db0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
10dc0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
10dd0 42 79 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  By){.  Walker w;
10de0 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a  .  w.eCode = 1;.
10df0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
10e00 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
10e10 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 3b  nstantOrGroupBy;
10e20 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
10e30 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  back = 0;.  w.u.
10e40 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
10e50 70 42 79 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pBy;.  w.pParse 
10e60 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
10e70 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10e80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10e90 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10ea0 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10eb0 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10ec0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10ed0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
10ee0 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
10ef0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
10f00 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
10f10 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
10f20 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
10f30 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
10f40 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
10f50 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
10f60 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
10f70 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
10f80 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
10f90 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
10fa0 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
10fb0 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
10fc0 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
10fd0 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
10fe0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
10ff0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
11000 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
11010 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
11020 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
11030 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
11040 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
11050 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
11060 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
11070 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11080 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
11090 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
110a0 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
110b0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
110c0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
110d0 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
110e0 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
110f0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
11100 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
11110 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
11120 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
11130 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
11140 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
11150 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77  w.eCode = 1;.  w
11160 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
11170 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
11180 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Noop;.  w.xSelec
11190 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
111a0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69  te3SelectWalkFai
111b0 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  l;.#ifdef SQLITE
111c0 5f 44 45 42 55 47 0a 20 20 77 2e 78 53 65 6c 65  _DEBUG.  w.xSele
111d0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 71  ctCallback2 = sq
111e0 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
111f0 73 73 65 72 74 32 3b 0a 23 65 6e 64 69 66 0a 20  ssert2;.#endif. 
11200 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
11210 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
11220 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
11230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
11240 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11250 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
11260 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
11270 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
11280 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
11290 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
112a0 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
112b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
112c0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
112d0 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
112e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
112f0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
11300 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
11310 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
11320 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
11330 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
11340 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
11350 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
11360 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
11370 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
11380 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
11390 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
113a0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
113b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
113c0 55 73 65 64 20 74 6f 20 6f 6e 6c 79 20 68 61 70  Used to only hap
113d0 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
113e0 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
113f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11400 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11410 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11420 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11430 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
11440 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
11450 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
11460 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11470 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
11480 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
11490 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
114a0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
114b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
114c0 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
114d0 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
114e0 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
114f0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11500 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11510 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11520 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11530 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
11540 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
11550 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
11560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11570 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11580 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
11590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
115a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
115b0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
115c0 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
115d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
115e0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
115f0 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11600 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11610 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11620 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11630 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
11640 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
11650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11660 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
11670 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
11680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11690 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
116a0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
116b0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
116c0 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
116d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
116e0 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
116f0 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11700 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11710 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11720 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11730 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
11740 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
11750 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
11760 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
11770 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
11780 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
11790 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
117a0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
117b0 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
117c0 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
117d0 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
117e0 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
117f0 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11800 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11810 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11820 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11830 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
11840 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
11850 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
11860 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
11870 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
11880 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
11890 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
118a0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
118b0 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
118c0 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
118d0 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
118e0 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
118f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11900 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11910 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11920 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11930 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11940 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11950 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c  ){.    p = p->pL
11960 65 66 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  eft;.  }.  op = 
11970 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
11980 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
11990 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
119a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
119b0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
119c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
119d0 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
119e0 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
119f0 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
11a00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
11a10 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
11a20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
11a30 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
11a40 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
11a50 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 79              p->y
11a60 2e 70 54 61 62 3d 3d 30 20 7c 7c 20 20 2f 2a 20  .pTab==0 ||  /* 
11a70 52 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6c  Reference to col
11a80 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 6f 6e 20  umn of index on 
11a90 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
11aa0 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69             (p->i
11ab0 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e  Column>=0 && p->
11ac0 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  y.pTab->aCol[p->
11ad0 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
11ae0 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
11af0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
11b00 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
11b10 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11b20 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11b30 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
11b40 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
11b50 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
11b60 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
11b70 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
11b80 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
11b90 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
11ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11bb0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
11bc0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
11bd0 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
11be0 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
11bf0 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
11c00 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
11c10 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
11c20 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
11c30 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
11c40 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
11c50 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
11c60 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
11c70 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
11c80 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
11c90 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
11ca0 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
11cb0 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
11cc0 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
11cd0 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
11ce0 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
11cf0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
11d00 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
11d10 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
11d20 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
11d30 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
11d40 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
11d50 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
11d60 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
11d70 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
11d80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
11d90 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
11da0 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
11db0 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
11dc0 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
11dd0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11de0 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
11df0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
11e00 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11e10 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11e20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
11e30 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
11e40 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
11e50 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
11e60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
11e70 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
11e80 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
11e90 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11eb0 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
11ec0 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
11ed0 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
11ee0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
11ef0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
11f00 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
11f10 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
11f20 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
11f30 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11f40 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
11f50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11f60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11f70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11f80 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11f90 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
11fa0 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
11fb0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
11fc0 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
11fd0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
11fe0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11ff0 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
12000 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
12010 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
12020 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
12030 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
12040 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
12050 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
12060 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12070 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12080 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
12090 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
120a0 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
120b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
120c0 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
120d0 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
120e0 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
120f0 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
12100 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
12110 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
12120 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
12130 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
12140 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
12150 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
12160 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
12170 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
12180 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
12190 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
121a0 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
121b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
121c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
121d0 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
121e0 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
121f0 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
12200 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
12210 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
12220 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
12230 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
12240 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
12250 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
12260 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
12270 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
12280 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
12290 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
122a0 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
122b0 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
122c0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
122d0 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
122e0 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
122f0 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
12300 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
12310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12320 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
12330 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
12340 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
12350 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
12360 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
12370 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
12380 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
12390 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
123a0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
123b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
123c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
123d0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
123e0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
123f0 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
12400 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
12410 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
12420 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
12430 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
12440 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12450 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12470 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
12480 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
12490 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
124a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
124b0 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
124c0 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
124d0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
124e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
124f0 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
12500 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12510 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
12520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
12530 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
12540 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
12550 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12560 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
12570 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
12580 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
12590 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
125a0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
125b0 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
125c0 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
125d0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
125e0 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
125f0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
12600 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
12610 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
12620 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
12630 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
12640 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
12650 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
12660 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
12670 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
12680 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
12690 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
126a0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73   p->pEList;.  as
126b0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
126c0 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45  );.  /* All SELE
126d0 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20  CT results must 
126e0 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20  be columns. */. 
126f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
12700 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12710 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65 73 20  .    Expr *pRes 
12720 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
12730 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52  Expr;.    if( pR
12740 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  es->op!=TK_COLUM
12750 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
12760 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
12770 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
12780 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f  0].iCursor );  /
12790 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74  * Not a correlat
127a0 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  ed subquery */. 
127b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
127c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
127d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
127e0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
127f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12800 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12810 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
12820 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
12830 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
12840 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
12850 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
12860 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
12870 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
12880 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
12890 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
128a0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
128b0 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
128c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
128d0 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
128e0 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
128f0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
12900 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
12910 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12920 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
12930 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12940 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
12950 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
12960 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
12970 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
12980 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
12990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
129a0 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
129b0 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
129c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129d0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
129e0 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
129f0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
12a00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12a10 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
12a20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
12a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12a40 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12a50 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
12a60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
12a70 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
12a80 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
12a90 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12aa0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23  e(v, addr1);.}.#
12ab0 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
12ac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12ad0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  UERY./*.** The a
12ae0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e  rgument is an IN
12af0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 61   operator with a
12b00 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62   list (not a sub
12b10 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a  query) on the .*
12b20 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
12b30 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
12b40 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  if that list is 
12b50 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61  constant..*/.sta
12b60 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
12b70 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45  nRhsIsConstant(E
12b80 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70  xpr *pIn){.  Exp
12b90 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72  r *pLHS;.  int r
12ba0 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  es;.  assert( !E
12bb0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12bc0 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  In, EP_xIsSelect
12bd0 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49  ) );.  pLHS = pI
12be0 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d  n->pLeft;.  pIn-
12bf0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65  >pLeft = 0;.  re
12c00 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  s = sqlite3ExprI
12c10 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a  sConstant(pIn);.
12c20 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70    pIn->pLeft = p
12c30 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  LHS;.  return re
12c40 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s;.}.#endif../*.
12c50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12c60 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
12c70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12c80 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
12c90 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
12ca0 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
12cb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
12cc0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
12cd0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
12ce0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
12cf0 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
12d00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
12d10 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
12d20 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
12d30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
12d40 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12d50 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
12d60 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
12d70 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
12d80 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
12d90 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
12da0 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
12db0 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
12dc0 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
12dd0 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
12de0 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
12df0 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
12e00 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
12e10 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
12e20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
12e30 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e  N operator.** an
12e40 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20  d pX->iTable is 
12e50 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
12e60 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e   of that cursor.
12e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
12e80 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ned value of thi
12e90 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63  s function indic
12ea0 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 20  ates the b-tree 
12eb0 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  type, as follows
12ec0 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  :.**.**   IN_IND
12ed0 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20  EX_ROWID      - 
12ee0 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
12ef0 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62  pened on a datab
12f00 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ase table..**   
12f10 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
12f20 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72  SC  - The cursor
12f30 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12f40 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12f50 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
12f60 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68  _INDEX_DESC - Th
12f70 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
12f80 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  ned on a descend
12f90 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
12fa0 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20  IN_INDEX_EPH    
12fb0 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
12fc0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
12fd0 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74   specially creat
12fe0 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ed and.**       
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
13010 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  remal table..** 
13020 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20    IN_INDEX_NOOP 
13030 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f        - No curso
13040 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e  r was allocated.
13050 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f    The IN operato
13060 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20  r must be.**    
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64       implemented
13090 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   as a sequence o
130a0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a  f comparisons..*
130b0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
130c0 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
130d0 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
130e0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
130f0 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
13100 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
13110 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13120 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c   <column1>, <col
13130 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74  umn2>... FROM <t
13140 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
13150 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
13160 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
13170 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f  ist or a more co
13180 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20  mplex subquery, 
13190 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d  then.** an ephem
131a0 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  eral table might
131b0 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65   need to be gene
131c0 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52  rated from the R
131d0 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70  HS and then.** p
131e0 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74  X->iTable made t
131f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65  o point to the e
13200 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
13210 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20  nstead of an.** 
13220 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a  existing table..
13230 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67  **.** The inFlag
13240 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  s parameter must
13250 20 63 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d   contain, at a m
13260 69 6e 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74  inimum, one of t
13270 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
13280 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
13290 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  r IN_INDEX_LOOP 
132a0 62 75 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49  but not both.  I
132b0 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69  f inFlags contai
132c0 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ns.** IN_INDEX_M
132d0 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20  EMBERSHIP, then 
132e0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61  the generated ta
132f0 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ble will be used
13300 20 66 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d   for a fast.** m
13310 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20  embership test. 
13320 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44   When the IN_IND
13330 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73  EX_LOOP bit is s
13340 65 74 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78  et, the IN index
13350 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64   will.** be used
13360 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c   to loop over al
13370 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  l values of the 
13380 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
13390 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  erator..**.** Wh
133a0 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  en IN_INDEX_LOOP
133b0 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
133c0 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
133d0 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
133e0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
133f0 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65  set members) the
13400 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73  n the b-tree mus
13410 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75  t not contain du
13420 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20  plicates..** An 
13430 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
13440 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
13450 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
13460 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
13470 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
13480 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
13490 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
134a0 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
134b0 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20  MARY KEY or due 
134c0 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63  to.** a UNIQUE c
134d0 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64  onstraint or ind
134e0 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49  ex..**.** When I
134f0 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
13500 49 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  IP is used (and 
13510 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
13520 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
13530 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
13540 68 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20  hip tests) then 
13550 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
13560 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
13570 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
13580 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65  mns> is a single
13590 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
135a0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61   KEY column or a
135b0 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20  n .** index can 
135c0 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68  be found with th
135d0 65 20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c  e specified <col
135e0 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66  umns> as its lef
135f0 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t-most..**.** If
13600 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
13610 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
13620 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
13630 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
13640 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
13650 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
13660 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
13670 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
13680 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
13690 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
136a0 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
136b0 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
136c0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
136d0 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
136e0 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
136f0 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
13700 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
13710 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
13720 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
13730 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
13740 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
13750 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
13760 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
13770 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
13780 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
13790 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
137a0 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
137b0 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
137c0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
137d0 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
137e0 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
137f0 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
13800 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
13810 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
13820 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
13830 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
13840 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
13850 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
13860 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
13870 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
13880 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
13890 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
138a0 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
138b0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
138c0 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
138d0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
138e0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
138f0 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
13900 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
13910 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
13920 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
13930 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
13940 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
13950 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
13960 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
13970 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
13980 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
13990 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
139a0 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
139b0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
139c0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
139d0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
139e0 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
139f0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
13a00 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
13a10 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
13a20 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
13a30 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
13a40 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
13a50 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
13a60 20 49 66 20 74 68 65 20 61 69 4d 61 70 20 70 61   If the aiMap pa
13a70 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e  rameter is not N
13a80 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69  ULL, it must poi
13a90 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63  nt to an array c
13aa0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
13ab0 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63   element for eac
13ac0 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65  h column returne
13ad0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
13ae0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65  statement on the
13af0 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49   RHS.** of the I
13b00 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e  N(...) operator.
13b10 20 54 68 65 20 69 27 74 68 20 65 6e 74 72 79 20   The i'th entry 
13b20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
13b30 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
13b40 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20  he.** offset of 
13b50 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
13b60 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
13b70 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65  e i'th column re
13b80 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
13b90 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61   SELECT. For exa
13ba0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70  mple, if the exp
13bb0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65  ression and sele
13bc0 63 74 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a  cted index are:.
13bd0 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20  **.**   (?,?,?) 
13be0 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c  IN (SELECT a, b,
13bf0 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20   c FROM t1).**  
13c00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
13c10 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b   ON t1(b, c, a);
13c20 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61  .**.** then aiMa
13c30 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64  p[] is populated
13c40 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e   with {2, 0, 1}.
13c50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13c60 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
13c80 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  InIndex(.  Parse
13c90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13ca0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13cb0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13cc0 70 72 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20  pr *pX,         
13cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13ce0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
13cf0 28 52 48 53 29 20 6f 66 20 74 68 65 20 49 4e 20  (RHS) of the IN 
13d00 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33  operator */.  u3
13d10 32 20 69 6e 46 6c 61 67 73 2c 20 20 20 20 20 20  2 inFlags,      
13d20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49           /* IN_I
13d30 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42  NDEX_LOOP, _MEMB
13d40 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f  ERSHIP, and/or _
13d50 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74  NOOP_OK */.  int
13d60 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
13d70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13d80 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c  ter holding NULL
13d90 20 73 74 61 74 75 73 2e 20 20 53 65 65 20 6e 6f   status.  See no
13da0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  tes */.  int *ai
13db0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
13dc0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
13dd0 72 6f 6d 20 49 6e 64 65 78 20 66 69 65 6c 64 73  rom Index fields
13de0 20 74 6f 20 52 48 53 20 66 69 65 6c 64 73 20 2a   to RHS fields *
13df0 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 20 20  /.  int *piTab  
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e10 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20 74 6f 20  * OUT: index to 
13e20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  use */.){.  Sele
13e30 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ct *p;          
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74    /* SELECT to t
13e60 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f  he right of IN o
13e70 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
13e80 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20   eType = 0;     
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48     /* Type of RH
13eb0 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45  S table. IN_INDE
13ec0 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  X_* */.  int iTa
13ed0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13ee0 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ++;            /
13ef0 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20  * Cursor of the 
13f00 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  RHS table */.  i
13f10 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 3b  nt mustBeUnique;
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13f40 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71  RHS must be uniq
13f50 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ue */.  Vdbe *v 
13f60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13f70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
13f80 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
13f90 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
13fa0 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f  .  assert( pX->o
13fb0 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75  p==TK_IN );.  mu
13fc0 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69 6e  stBeUnique = (in
13fd0 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
13fe0 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a  _LOOP)!=0;..  /*
13ff0 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
14000 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  his IN(...) oper
14010 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43 54  ator is a SELECT
14020 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74 74  , and if it matt
14030 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ers .  ** whethe
14040 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45 4c  r or not the SEL
14050 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  ECT result conta
14060 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ins NULL values,
14070 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20   check whether. 
14080 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c 20   ** or not NULL 
14090 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
140a0 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f 74  ible (it may not
140b0 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   be, for example
140c0 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20 4e  , due .  ** to N
140d0 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
140e0 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  nts in the schem
140f0 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20 76  a). If no NULL v
14100 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69 62  alues are possib
14110 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72 52  le,.  ** set prR
14120 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20 62  hsHasNull to 0 b
14130 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67  efore continuing
14140 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52 68  .  */.  if( prRh
14150 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58 2d  sHasNull && (pX-
14160 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14170 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 6e  elect) ){.    in
14180 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  t i;.    ExprLis
14190 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e  t *pEList = pX->
141a0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
141b0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
141c0 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
141d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
141e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
141f0 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b  eNull(pEList->a[
14200 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61  i].pExpr) ) brea
14210 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
14220 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70   i==pEList->nExp
14230 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73  r ){.      prRhs
14240 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  HasNull = 0;.   
14250 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
14260 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
14270 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
14280 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
14290 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
142a0 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
142b0 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
142c0 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
142d0 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
142e0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
142f0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
14300 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20  nErr==0 && (p = 
14310 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
14320 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20  Opt(pX))!=0 ){. 
14330 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
14340 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
14360 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14370 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
14380 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143a0 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
143b0 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143e0 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
143f0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45  or pTab */.    E
14400 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14410 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
14420 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c   int nExpr = pEL
14430 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20  ist->nExpr;..   
14440 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14450 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
14460 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14470 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14480 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14490 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
144a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
144b0 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
144c0 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
144d0 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
144e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
144f0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
14500 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
14510 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
14520 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
14530 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
14540 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20  >a[0].pTab;..   
14550 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
14560 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
14570 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
14580 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
14590 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
145a0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
145b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
145c0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
145d0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
145e0 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
145f0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14600 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14610 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14620 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73  zName);..    ass
14630 65 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69  ert(v);  /* sqli
14640 74 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73  te3GetVdbe() has
14650 20 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65   always been pre
14660 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a  viously called *
14670 2f 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d  /.    if( nExpr=
14680 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
14690 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
146a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  n<0 ){.      /* 
146b0 54 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43  The "x IN (SELEC
146c0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62  T rowid FROM tab
146d0 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20  le)" case */.   
146e0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
146f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14700 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20  (v, OP_Once);.  
14710 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14720 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
14730 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
14740 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
14750 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
14760 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
14770 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
14780 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
14790 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
147a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
147b0 20 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45   "USING ROWID SE
147c0 41 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73  ARCH ON TABLE %s
147d0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
147e0 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pTab->zName));
147f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14800 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
14810 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
14820 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
14830 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
14840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14850 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14860 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14870 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
14880 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
14890 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
148a0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
148b0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
148c0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
148d0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
148e0 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
148f0 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
14900 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
14910 69 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  in table.      *
14920 2a 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  * on the RHS of 
14930 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
14940 20 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20    If it not, it 
14950 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
14960 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20  to.      ** use 
14970 61 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65  any index of the
14980 20 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a   RHS table.  */.
14990 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
149a0 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
149b0 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
149c0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
149d0 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
149e0 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
149f0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
14a00 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
14a10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14a20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
14a30 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
14a40 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
14a50 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62  umnAffinity(pTab
14a60 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74  ,iCol); /* RHS t
14a70 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14a80 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71  char cmpaff = sq
14a90 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
14aa0 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66  nity(pLhs, idxaf
14ab0 66 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  f);.        test
14ac0 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
14ad0 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
14ae0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14af0 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54  e( cmpaff==SQLIT
14b00 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
14b10 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
14b20 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
14b30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
14b40 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
14b50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14b60 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
14b70 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
14b80 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
14b90 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
14ba0 28 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20  () only returns 
14bb0 54 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65  TEXT if one side
14bc0 20 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20   or the.        
14bd0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73      ** other has
14be0 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64   no affinity and
14bf0 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
14c00 69 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c  is TEXT.  Hence,
14c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
14c20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72  the only way for
14c30 20 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45   cmpaff to be TE
14c40 58 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66  XT is for idxaff
14c50 20 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20   to be TEXT.    
14c60 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66          ** and f
14c70 6f 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74  or the term on t
14c80 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
14c90 20 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69   to have no affi
14ca0 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nity. */.       
14cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
14cc0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
14cd0 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20  TEXT );.        
14ce0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14cf0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
14d00 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
14d10 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
14d20 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
14d30 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
14d40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14d50 20 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f     if( affinity_
14d60 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ok ){.        /*
14d70 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   Search for an e
14d80 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68  xisting index th
14d90 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72  at will work for
14da0 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
14db0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  r */.        for
14dc0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
14dd0 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
14de0 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d  e==0; pIdx=pIdx-
14df0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14e00 20 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73     Bitmask colUs
14e10 65 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ed;      /* Colu
14e20 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
14e30 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
14e40 20 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b     Bitmask mCol;
14e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
14e60 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
14e70 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20   column */.     
14e80 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
14e90 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63  Column<nExpr ) c
14ea0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14eb0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
14ec0 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
14ed0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
14ee0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
14ef0 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c  Column is BMS-2,
14f00 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74   not BMS-1, so t
14f10 68 61 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75  hat we can compu
14f20 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
14f30 42 49 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77  BITMASK(nExpr) w
14f40 69 74 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69  ithout overflowi
14f50 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
14f60 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e  testcase( pIdx->
14f70 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29  nColumn==BMS-2 )
14f80 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
14f90 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  case( pIdx->nCol
14fa0 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  umn==BMS-1 );.  
14fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14fc0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31  ->nColumn>=BMS-1
14fd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14fe0 20 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42         if( mustB
14ff0 65 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20  eUnique ){.     
15000 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15010 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20  >nKeyCol>nExpr. 
15020 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70              ||(p
15030 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78  Idx->nColumn>nEx
15040 70 72 20 26 26 20 21 49 73 55 6e 69 71 75 65 49  pr && !IsUniqueI
15050 6e 64 65 78 28 70 49 64 78 29 29 0a 20 20 20 20  ndex(pIdx)).    
15060 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
15070 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
15080 65 3b 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65  e;  /* This inde
15090 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  x is not unique 
150a0 6f 76 65 72 20 74 68 65 20 49 4e 20 52 48 53 20  over the IN RHS 
150b0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
150c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
150e0 20 20 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20    colUsed = 0;  
150f0 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69   /* Columns of i
15100 6e 64 65 78 20 75 73 65 64 20 73 6f 20 66 61 72  ndex used so far
15110 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
15120 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
15130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15140 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
15150 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c  qlite3VectorFiel
15160 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65  dSubexpr(pX->pLe
15170 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
15180 20 20 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d      Expr *pRhs =
15190 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
151a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
151b0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
151c0 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
151d0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
151e0 72 73 65 2c 20 70 4c 68 73 2c 20 70 52 68 73 29  rse, pLhs, pRhs)
151f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
15200 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  t j;.  .        
15210 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 71      assert( pReq
15220 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 69 43 6f  !=0 || pRhs->iCo
15230 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  lumn==XN_ROWID |
15240 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
15250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
15260 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20  r(j=0; j<nExpr; 
15270 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
15280 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15290 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
152a0 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
152b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
152c0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
152d0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20  >azColl[j] );.  
152e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
152f0 70 52 65 71 21 3d 30 20 26 26 20 73 71 6c 69 74  pReq!=0 && sqlit
15300 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
15310 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
15320 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[j])!=0 ){.  
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
15340 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15380 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45         if( j==nE
15390 78 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xpr ) break;.   
153a0 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 20 3d 20           mCol = 
153b0 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20 20 20 20  MASKBIT(j);.    
153c0 20 20 20 20 20 20 20 20 69 66 28 20 6d 43 6f 6c          if( mCol
153d0 20 26 20 63 6f 6c 55 73 65 64 20 29 20 62 72 65   & colUsed ) bre
153e0 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63 6f 6c 75  ak; /* Each colu
153f0 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20 6f 6e 63  mn used only onc
15400 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
15410 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d 43 6f 6c   colUsed |= mCol
15420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15430 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61 70 5b  ( aiMap ) aiMap[
15440 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  i] = j;.        
15450 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
15460 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 45 78 70   assert( i==nExp
15470 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21 3d 28 4d  r || colUsed!=(M
15480 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
15490 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
154a0 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d 41 53 4b  ( colUsed==(MASK
154b0 42 49 54 28 6e 45 78 70 72 29 2d 31 29 20 29 7b  BIT(nExpr)-1) ){
154c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
154d0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
154e0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
154f0 6e 73 20 74 68 65 20 69 6e 64 65 78 20 70 49 64  ns the index pId
15500 78 20 69 73 20 75 73 61 62 6c 65 20 2a 2f 0a 20  x is usable */. 
15510 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
15520 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
15530 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
15540 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
15550 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
15560 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
15570 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 0a  lan((pParse, 0,.
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
155a0 53 49 4e 47 20 49 4e 44 45 58 20 25 73 20 46 4f  SING INDEX %s FO
155b0 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22 2c 70  R IN-OPERATOR",p
155c0 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
155d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
155e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
155f0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
15600 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
15610 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
15620 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
15630 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15640 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
15650 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15660 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
15670 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
15680 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
15690 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
156a0 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
156b0 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
156c0 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
156d0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
156e0 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
156f0 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20 20 20 20  rder[0];.  .    
15700 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
15710 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23 69 66 64  sHasNull ){.#ifd
15720 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15730 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53  _COLUMN_USED_MAS
15740 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
15750 69 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e  i64 mask = (1<<n
15760 45 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20  Expr)-1;.       
15770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15780 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
15790 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
157a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157b0 20 20 20 69 54 61 62 2c 20 30 2c 20 30 2c 20 28     iTab, 0, 0, (
157c0 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34 5f 49 4e  u8*)&mask, P4_IN
157d0 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  T64);.#endif.   
157e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
157f0 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
15800 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15810 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 78           if( nEx
15820 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr==1 ){.       
15830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15840 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15850 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
15860 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
15870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15890 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
158a0 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
158b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
158c0 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f       } /* End lo
158d0 6f 70 20 6f 76 65 72 20 69 6e 64 65 78 65 73 20  op over indexes 
158e0 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e  */.      } /* En
158f0 64 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f  d if( affinity_o
15900 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20 2f 2a 20  k ) */.    } /* 
15910 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e 20 72 6f  End if not an ro
15920 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 7d  wid index */.  }
15930 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d 70 74 20   /* End attempt 
15940 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75 73 69 6e  to optimize usin
15950 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  g an index */.. 
15960 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
15970 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
15980 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
15990 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
159a0 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
159b0 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
159c0 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
159d0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
159e0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
159f0 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
15a00 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
15a10 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
15a20 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
15a30 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
15a40 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
15a50 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
15a60 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
15a70 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
15a80 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
15a90 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
15aa0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
15ab0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
15ac0 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
15ad0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
15ae0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
15af0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
15b00 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
15b10 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
15b20 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
15b30 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
15b40 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
15b50 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
15b60 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
15b70 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
15b80 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
15b90 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
15ba0 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
15bb0 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
15bc0 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
15bd0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
15be0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
15bf0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
15c00 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
15c10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
15c20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
15c30 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
15c40 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
15c50 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
15c60 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
15c70 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
15c80 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
15c90 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
15ca0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
15cb0 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d  yLoop = 0;.    }
15cc0 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
15cd0 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
15ce0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
15cf0 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
15d00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15d10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15d20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
15d30 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15d40 52 68 73 4f 66 49 4e 28 70 50 61 72 73 65 2c 20  RhsOfIN(pParse, 
15d50 70 58 2c 20 69 54 61 62 29 3b 0a 20 20 20 20 69  pX, iTab);.    i
15d60 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
15d70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15d80 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
15d90 2c 20 69 54 61 62 2c 20 72 4d 61 79 48 61 76 65  , iTab, rMayHave
15da0 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
15db0 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
15dc0 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
15dd0 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20 20 69 66  yLoop;.  }..  if
15de0 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
15df0 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
15e00 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
15e10 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
15e20 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
15e30 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
15e40 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
15e50 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
15e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
15e70 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
15e80 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 61 62 20  i;.  }.  *piTab 
15e90 3d 20 69 54 61 62 3b 0a 20 20 72 65 74 75 72 6e  = iTab;.  return
15ea0 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
15eb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15ec0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
15ed0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
15ee0 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
15ef0 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
15f00 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
15f10 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
15f20 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
15f30 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
15f40 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
15f50 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
15f60 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
15f70 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
15f80 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
15f90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
15fa0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15fb0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
15fc0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
15fd0 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
15fe0 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
15ff0 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
16000 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
16010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
16020 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
16030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16040 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
16050 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
16060 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
16070 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
16080 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
16090 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
160a0 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
160b0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
160c0 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
160d0 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
160e0 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
160f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16100 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
16110 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
16120 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65  MallocRaw(pParse
16130 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
16140 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
16150 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
16160 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
16170 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16180 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
16190 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
161a0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
161b0 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
161c0 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
161d0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
161e0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
161f0 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
16200 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
16210 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
16220 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
16230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16240 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
16250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16260 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
16270 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
16280 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
16290 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
162a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
162b0 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
162c0 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
162d0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
162e0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
162f0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
16300 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
16310 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
16320 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
16330 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16340 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
16350 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
16360 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
16370 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
16380 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
16390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
163a0 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
163b0 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
163c0 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
163d0 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
163e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
163f0 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
16400 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
16410 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
16420 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65 63  n pExpr is a vec
16430 74 6f 72 20 74 68 61 74 20 68 61 73 20 62 65 65  tor that has bee
16440 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74  n used in a cont
16450 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ext where.** it 
16460 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
16470 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  . If pExpr is a 
16480 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63 74 6f  sub-select vecto
16490 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
164a0 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20 50 61  .** loads the Pa
164b0 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20  rse object with 
164c0 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65  a message of the
164d0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
164e0 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72  sub-select retur
164f0 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65  ns N columns - e
16500 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a 2a 2a  xpected 1".**.**
16510 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 61 20   Or, if it is a 
16520 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72 20 76  regular scalar v
16530 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ector:.**.**   "
16540 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
16550 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  d".*/   .void sq
16560 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
16570 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Msg(Parse *pPars
16580 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
16590 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
165a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
165b0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
165c0 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
165d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 75  ){.    sqlite3Su
165e0 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  bselectError(pPa
165f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
16600 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
16610 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Expr, 1);.  }els
16620 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
16630 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16640 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
16650 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
16660 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
16670 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16680 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
16690 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
166a0 20 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 65 70   construct an ep
166b0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 63 6f  hemeral table co
166c0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 74 65 72  ntaining all ter
166d0 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20 52 48 53  ms.** in the RHS
166e0 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
166f0 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72  or.  The IN oper
16700 61 74 6f 72 20 63 61 6e 20 62 65 20 69 6e 20 65  ator can be in e
16710 69 74 68 65 72 20 6f 66 20 74 77 6f 0a 2a 2a 20  ither of two.** 
16720 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
16730 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
16740 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
16750 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
16760 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
16770 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
16780 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
16790 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
167a0 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
167b0 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
167c0 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
167d0 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  xpr parameter is
167e0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
167f0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
16800 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20  mber for the.** 
16810 63 6f 6e 73 74 72 75 63 74 65 64 20 65 70 68 65  constructed ephe
16820 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  rmeral table is 
16830 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 66  returned.  The f
16840 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 65 70  irst time the ep
16850 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
16860 20 69 73 20 63 6f 6d 70 75 74 65 64 2c 20 74 68   is computed, th
16870 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
16880 69 73 20 61 6c 73 6f 20 73 74 6f 72 65 64 20 69  is also stored i
16890 6e 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  n pExpr->iTable,
168a0 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74 68 65 20  .** however the 
168b0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 72 65  cursor number re
168c0 74 75 72 6e 65 64 20 6d 69 67 68 74 20 6e 6f 74  turned might not
168d0 20 62 65 20 74 68 65 20 73 61 6d 65 2c 20 61 73   be the same, as
168e0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76   it might.** hav
168f0 65 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65  e been duplicate
16900 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70 65 6e 44  d using OP_OpenD
16910 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  up..**.** If the
16920 20 4c 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   LHS expression 
16930 28 22 78 22 20 69 6e 20 74 68 65 20 65 78 61 6d  ("x" in the exam
16940 70 6c 65 73 29 20 69 73 20 61 20 63 6f 6c 75 6d  ples) is a colum
16950 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a 2a 20 74  n value, or.** t
16960 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
16970 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
16980 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
16990 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
169a0 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20   that.** column 
169b0 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
169c0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
169d0 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
169e0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 2e   the.** SELECT..
169f0 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
16a00 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
16a10 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
16a20 73 20 75 73 65 64 0a 2a 2a 20 69 66 20 65 69 74  s used.** if eit
16a30 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
16a40 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
16a50 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
16a60 65 69 74 68 65 72 0a 2a 2a 20 27 78 27 20 6e 6f  either.** 'x' no
16a70 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
16a80 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
16a90 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
16aa0 72 69 63 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ric affinity.** 
16ab0 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
16ac0 20 73 71 6c 69 74 65 33 43 6f 64 65 52 68 73 4f   sqlite3CodeRhsO
16ad0 66 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  fIN(.  Parse *pP
16ae0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
16af0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16b00 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
16b10 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
16b20 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * The IN operato
16b30 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  r */.  int iTab 
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b50 2a 20 55 73 65 20 74 68 69 73 20 63 75 72 73 6f  * Use this curso
16b60 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  r number */.){. 
16b70 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
16b80 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
16b90 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
16ba0 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
16bb0 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a 20 20 69  on at top */.  i
16bc0 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
16bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16be0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
16bf0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
16c00 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
16c10 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
16c20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 4c 48         /* the LH
16c30 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
16c40 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  ator */.  KeyInf
16c50 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
16c60 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
16c70 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  ormation */.  in
16c80 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20  t nVal;         
16c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16ca0 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66  e of vector pLef
16cb0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
16ce0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
16cf0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
16d00 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  */..  v = pParse
16d10 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
16d20 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  t( v!=0 );..  /*
16d30 20 54 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   The evaluation 
16d40 6f 66 20 74 68 65 20 49 4e 20 6d 75 73 74 20 62  of the IN must b
16d50 65 20 72 65 70 65 61 74 65 64 20 65 76 65 72 79  e repeated every
16d60 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a 20 69 73   time it.  ** is
16d70 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
16d80 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
16d90 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
16da0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
16db0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
16dc0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
16dd0 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
16de0 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
16df0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
16e00 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
16e10 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
16e20 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
16e30 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
16e40 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
16e50 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
16e60 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
16e70 20 74 68 65 6e 20 77 65 20 63 61 6e 20 63 6f 6d   then we can com
16e80 70 75 74 65 20 74 68 65 20 52 48 53 20 6a 75 73  pute the RHS jus
16e90 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61 6e 64 20  t once.  ** and 
16ea0 72 65 75 73 65 20 69 74 20 6d 61 6e 79 20 6e 61  reuse it many na
16eb0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mes..  */.  if( 
16ec0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16ed0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
16ee0 6c 65 63 74 29 20 26 26 20 70 50 61 72 73 65 2d  lect) && pParse-
16ef0 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20 29 7b 0a  >iSelfTab==0 ){.
16f00 20 20 20 20 2f 2a 20 52 65 75 73 65 20 6f 66 20      /* Reuse of 
16f10 74 68 65 20 52 48 53 20 69 73 20 61 6c 6c 6f 77  the RHS is allow
16f20 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ed */.    /* If 
16f30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
16f40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
16f50 64 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 65  ded, but the pre
16f60 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 2a  vious code.    *
16f70 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  * might not have
16f80 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64 20 79 65   been invoked ye
16f90 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 69 74 20  t, so invoke it 
16fa0 6e 6f 77 20 61 73 20 61 20 73 75 62 72 6f 75 74  now as a subrout
16fb0 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ine. .    */.   
16fc0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
16fd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
16fe0 75 62 72 74 6e 29 20 29 7b 0a 20 20 20 20 20 20  ubrtn) ){.      
16ff0 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74  addrOnce = sqlit
17000 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
17010 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
17020 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17030 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
17040 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
17050 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
17060 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17070 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
17080 2c 20 22 52 45 55 53 45 20 4c 49 53 54 20 53 55  , "REUSE LIST SU
17090 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
170a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
170b0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 49  >x.pSelect->selI
170c0 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d));.      }.   
170d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
170f0 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72  , pExpr->y.sub.r
17100 65 67 52 65 74 75 72 6e 2c 0a 20 20 20 20 20 20  egReturn,.      
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
17130 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
17140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17150 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 69 54  , OP_OpenDup, iT
17160 61 62 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ab, pExpr->iTabl
17170 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
17180 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17190 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
171a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
171b0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63 6f  .    /* Begin co
171c0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
171d0 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 53  ine */.    ExprS
171e0 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
171f0 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20 20  , EP_Subrtn);.  
17200 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72    pExpr->y.sub.r
17210 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
17220 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
17230 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64  Expr->y.sub.iAdd
17240 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r =.      sqlite
17250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17260 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 45  P_Integer, 0, pE
17270 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65  xpr->y.sub.regRe
17280 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20 56  turn) + 1;.    V
17290 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
172a0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22 29  return address")
172b0 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63 65  );..    addrOnce
172c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
172d0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
172e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
172f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
17300 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
17310 73 20 69 73 20 61 20 76 65 63 74 6f 72 20 49 4e  s is a vector IN
17320 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70   operator */.  p
17330 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
17340 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d 20 73 71  eft;.  nVal = sq
17350 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
17360 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a 20 20 2f  ize(pLeft);..  /
17370 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
17380 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
17390 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e 74 61 69  that will contai
173a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
173b0 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20 74 68 65  .  ** RHS of the
173c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
173d0 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  */.  pExpr->iTab
173e0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 61 64 64  le = iTab;.  add
173f0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17400 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
17410 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
17420 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61 6c 29 3b  ->iTable, nVal);
17430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17440 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
17450 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20 45 78 70  MMENTS.  if( Exp
17460 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17470 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17480 29 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ) ){.    VdbeCom
17490 6d 65 6e 74 28 28 76 2c 20 22 52 65 73 75 6c 74  ment((v, "Result
174a0 20 6f 66 20 53 45 4c 45 43 54 20 25 75 22 2c 20   of SELECT %u", 
174b0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
174c0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 7d 65 6c  ->selId));.  }el
174d0 73 65 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  se{.    VdbeComm
174e0 65 6e 74 28 28 76 2c 20 22 52 48 53 20 6f 66 20  ent((v, "RHS of 
174f0 49 4e 20 6f 70 65 72 61 74 6f 72 22 29 29 3b 0a  IN operator"));.
17500 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4b 65    }.#endif.  pKe
17510 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
17520 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
17530 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31 29  se->db, nVal, 1)
17540 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
17550 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17560 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
17570 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  .    /* Case 1: 
17580 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
17590 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 2a 2a 0a  ECT ...).    **.
175a0 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
175b0 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
175c0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
175d0 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
175e0 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
175f0 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
17600 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
17610 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53  ve..    */.    S
17620 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
17630 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
17640 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  t;.    ExprList 
17650 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  *pEList = pSelec
17660 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t->pEList;..    
17670 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
17680 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
17690 4c 49 53 54 20 53 55 42 51 55 45 52 59 20 25 64  LIST SUBQUERY %d
176a0 22 2c 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  ",.        addrO
176b0 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  nce?"":"CORRELAT
176c0 45 44 20 22 2c 20 70 53 65 6c 65 63 74 2d 3e 73  ED ", pSelect->s
176d0 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a 20 20 20  elId.    ));.   
176e0 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 61   /* If the LHS a
176f0 6e 64 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  nd RHS of the IN
17700 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
17710 20 6d 61 74 63 68 2c 20 74 68 61 74 0a 20 20 20   match, that.   
17720 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c 6c 20 68   ** error will h
17730 61 76 65 20 62 65 65 6e 20 63 61 75 67 68 74 20  ave been caught 
17740 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77 65 20 72  long before we r
17750 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e  each this point.
17760 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41   */.    if( ALWA
17770 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  YS(pEList->nExpr
17780 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  ==nVal) ){.     
17790 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
177a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
177b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
177c0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
177d0 2c 20 53 52 54 5f 53 65 74 2c 20 69 54 61 62 29  , SRT_Set, iTab)
177e0 3b 0a 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66  ;.      dest.zAf
177f0 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66  fSdst = exprINAf
17800 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
17810 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 53 65  Expr);.      pSe
17820 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
17830 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17840 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
17850 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
17860 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
17870 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30  ase( pKeyInfo==0
17880 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79   ); /* Caused by
17890 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b   OOM in sqlite3K
178a0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f  eyInfoAlloc() */
178b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
178c0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
178d0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
178e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
178f0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
17900 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53  ->db, dest.zAffS
17910 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  dst);.        sq
17920 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
17930 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
17940 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
17950 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17960 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
17970 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64  >db, dest.zAffSd
17980 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
17990 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
179a0 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
179b0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
179c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
179d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
179e0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
179f0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
17a00 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
17a10 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
17a20 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
17a30 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
17a40 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
17a50 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
17a60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
17a70 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
17a80 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66  ieldSubexpr(pLef
17a90 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  t, i);.        p
17aa0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
17ab0 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
17ac0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
17ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
17ae0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e  rse, p, pEList->
17af0 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20  a[i].pExpr.     
17b00 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
17b10 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17b20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
17b30 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
17b40 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
17b50 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
17b60 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t).    **.    **
17b70 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
17b80 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
17b90 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
17ba0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
17bb0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74  .    ** store it
17bc0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
17bd0 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70  y table. If <exp
17be0 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  r> is a column, 
17bf0 74 68 65 6e 20 75 73 65 0a 20 20 20 20 2a 2a 20  then use.    ** 
17c00 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
17c10 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
17c20 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
17c30 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
17c40 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e  .    ** a column
17c50 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
17c60 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
17c70 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
17c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17c90 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
17ca0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
17cb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
17cc0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17cd0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17ce0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  ;.    struct Exp
17cf0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
17d00 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31 2c 20 72  m;.    int r1, r
17d10 32 2c 20 72 33 3b 0a 20 20 20 20 61 66 66 69 6e  2, r3;.    affin
17d20 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
17d30 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
17d40 3b 0a 20 20 20 20 69 66 28 20 21 61 66 66 69 6e  ;.    if( !affin
17d50 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61 66 66  ity ){.      aff
17d60 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
17d70 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20  FF_BLOB;.    }. 
17d80 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
17d90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17da0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
17db0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
17dc0 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b  nfo) );.      pK
17dd0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
17de0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17df0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
17e00 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
17e10 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20   }..    /* Loop 
17e20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
17e30 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
17e40 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31  list>. */.    r1
17e50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17e60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17e70 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
17e80 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17e90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73  ;.    for(i=pLis
17ea0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
17eb0 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
17ec0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
17ed0 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
17ee0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
17ef0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
17f00 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
17f10 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
17f20 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
17f30 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
17f40 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
17f50 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
17f60 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
17f70 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  e.      ** this 
17f80 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
17f90 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
17fa0 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
17fb0 74 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78  tant.      ** ex
17fc0 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
17fd0 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
17fe0 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
17ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18000 28 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73  ( addrOnce && !s
18010 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
18020 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
18030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18040 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
18050 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20  addrOnce);.     
18060 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
18070 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
18080 75 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20 20  ubrtn);.        
18090 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20  addrOnce = 0;.  
180a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
180b0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
180c0 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
180d0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
180e0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
180f0 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
18100 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18110 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
18120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18130 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
18140 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
18150 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
18160 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18170 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
18180 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
18190 69 54 61 62 2c 20 72 32 2c 20 72 33 2c 20 31 29  iTab, r2, r3, 1)
181a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
181b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
181c0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
181d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
181e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
181f0 20 72 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   r2);.  }.  if( 
18200 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
18210 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18220 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
18230 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
18240 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 0a  4_KEYINFO);.  }.
18250 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29    if( addrOnce )
18260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18270 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
18280 72 4f 6e 63 65 29 3b 0a 20 20 20 20 2f 2a 20 53  rOnce);.    /* S
18290 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
182a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
182b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
182c0 52 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79  Return, pExpr->y
182d0 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b  .sub.regReturn);
182e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
182f0 43 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70  ChangeP1(v, pExp
18300 72 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31  r->y.sub.iAddr-1
18310 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
18320 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a  rentAddr(v)-1);.
18330 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
18340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18350 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
18360 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
18370 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
18380 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
18390 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
183a0 0a 2a 2a 20 6f 72 20 45 58 49 53 54 53 20 6f 70  .** or EXISTS op
183b0 65 72 61 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  erator:.**.**   
183c0 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
183d0 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
183e0 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
183f0 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
18400 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
18410 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
18420 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
18430 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 53  rameter is the S
18440 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
18450 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 63  operator to be c
18460 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
18470 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
18480 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e 20  lds the result. 
18490 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f 6c   For a multi-col
184a0 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a 20  umn SELECT, .** 
184b0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
184c0 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67  ored in a contig
184d0 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72 65  uous array of re
184e0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 0a  gisters and the.
184f0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
18500 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20  is the register 
18510 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  of the left-most
18520 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 0a   result column..
18530 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 61  ** Return 0 if a
18540 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
18550 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18560 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
18570 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
18580 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
18590 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
185a0 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  xpr){.  int addr
185b0 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Once = 0;       
185c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
185d0 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f 70  f OP_Once at top
185e0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 2a   of subroutine *
185f0 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
18600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18610 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
18620 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
18630 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18650 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
18660 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
18670 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
18680 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
18690 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
186a0 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
186b0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20 20  */.  int nReg;  
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f   /* Registers to
186e0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 45   allocate */.  E
186f0 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
18700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
18710 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73 69  w limit expressi
18720 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a 76  on */..  Vdbe *v
18730 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
18740 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
18750 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
18760 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
18770 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63 61  ISTS );.  testca
18780 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
18790 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61 73  K_SELECT );.  as
187a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
187b0 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
187c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
187d0 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
187e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
187f0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18800 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20 3d  ect) );.  pSel =
18810 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
18820 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61  t;..  /* The eva
18830 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  luation of the E
18840 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75 73  XISTS/SELECT mus
18850 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
18860 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
18870 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
18880 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
18890 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
188a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
188b0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
188c0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
188d0 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
188e0 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
188f0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
18900 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
18910 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
18920 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
18930 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
18940 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
18950 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
18960 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
18970 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
18980 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
18990 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
189a0 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
189b0 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
189c0 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
189d0 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
189e0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
189f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18a00 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
18a10 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ect) ){.    /* I
18a20 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68  f this routine h
18a30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
18a40 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  coded, then invo
18a50 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20 2a  ke it as a.    *
18a60 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a 2f  * subroutine. */
18a70 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
18a80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18a90 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20  EP_Subrtn) ){.  
18aa0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
18ab0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
18ac0 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52 59   "REUSE SUBQUERY
18ad0 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49   %d", pSel->selI
18ae0 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d));.      sqlit
18af0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18b00 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72 2d  OP_Gosub, pExpr-
18b10 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72 6e  >y.sub.regReturn
18b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18b30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
18b40 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a 20  >y.sub.iAddr);. 
18b50 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
18b60 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d  r->iTable;.    }
18b70 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 63  ..    /* Begin c
18b80 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  oding the subrou
18b90 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  tine */.    Expr
18ba0 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
18bb0 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a 20  r, EP_Subrtn);. 
18bc0 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e     pExpr->y.sub.
18bd0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
18be0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
18bf0 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
18c00 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  dr =.      sqlit
18c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18c20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
18c30 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52  Expr->y.sub.regR
18c40 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20 20  eturn) + 1;.    
18c50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18c60 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 22  "return address"
18c70 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e 63  ));..    addrOnc
18c80 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
18c90 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp0(v, OP_Once
18ca0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18cb0 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  v);.  }.  .  /* 
18cc0 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67 65  For a SELECT, ge
18cd0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
18ce0 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ut the values fo
18cf0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
18d00 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
18d10 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  row into an arra
18d20 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
18d30 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e  nd return the in
18d40 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  dex of.  ** the 
18d50 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e 0a  first register..
18d60 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
18d70 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
18d80 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65 72  write an integer
18d90 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
18da0 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20 20  or 1 (exists).  
18db0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
18dc0 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  er and return th
18dd0 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  at register numb
18de0 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  er..  **.  ** In
18df0 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65   both cases, the
18e00 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65 6e   query is augmen
18e10 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54 20  ted with "LIMIT 
18e20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20 70  1".  Any .  ** p
18e30 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69 74  reexisting limit
18e40 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69 6e   is discarded in
18e50 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e 65   place of the ne
18e60 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f 0a  w LIMIT 1..  */.
18e70 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18e80 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
18e90 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45 52  %sSCALAR SUBQUER
18ea0 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61  Y %d",.        a
18eb0 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52  ddrOnce?"":"CORR
18ec0 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d 3e  ELATED ", pSel->
18ed0 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67 20  selId));.  nReg 
18ee0 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  = pExpr->op==TK_
18ef0 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70  SELECT ? pSel->p
18f00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31  EList->nExpr : 1
18f10 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
18f20 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
18f30 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d   0, pParse->nMem
18f40 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  +1);.  pParse->n
18f50 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 69  Mem += nReg;.  i
18f60 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
18f70 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 64  _SELECT ){.    d
18f80 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
18f90 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69 53  Mem;.    dest.iS
18fa0 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
18fb0 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64  rm;.    dest.nSd
18fc0 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 73  st = nReg;.    s
18fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18fe0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
18ff0 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65  dest.iSDParm, de
19000 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d  st.iSDParm+nReg-
19010 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
19020 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
19030 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
19040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
19050 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
19060 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c 69  Exists;.    sqli
19070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19080 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
19090 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
190a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
190b0 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
190c0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a 20  result"));.  }. 
190d0 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65   pLimit = sqlite
190e0 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
190f0 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
19100 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  R,&sqlite3IntTok
19110 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 69 66  ens[1], 0);.  if
19120 28 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 29  ( pSel->pLimit )
19130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
19140 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
19150 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
19160 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53  ->pLeft);.    pS
19170 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
19180 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65  t = pLimit;.  }e
19190 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70  lse{.    pSel->p
191a0 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
191b0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
191c0 4c 49 4d 49 54 2c 20 70 4c 69 6d 69 74 2c 20 30  LIMIT, pLimit, 0
191d0 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 2d 3e 69  );.  }.  pSel->i
191e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 66 28  Limit = 0;.  if(
191f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19200 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
19210 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
19220 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72  n 0;.  }.  pExpr
19230 2d 3e 69 54 61 62 6c 65 20 3d 20 72 52 65 67 20  ->iTable = rReg 
19240 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
19250 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
19260 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
19270 6f 52 65 64 75 63 65 29 3b 0a 20 20 69 66 28 20  oReduce);.  if( 
19280 61 64 64 72 4f 6e 63 65 20 29 7b 0a 20 20 20 20  addrOnce ){.    
19290 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
192a0 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
192b0 3b 0a 0a 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;..    /* Subrou
192c0 74 69 6e 65 20 72 65 74 75 72 6e 20 2a 2f 0a 20  tine return */. 
192d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192e0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
192f0 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e  n, pExpr->y.sub.
19300 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
19310 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19320 65 50 31 28 76 2c 20 70 45 78 70 72 2d 3e 79 2e  eP1(v, pExpr->y.
19330 73 75 62 2e 69 41 64 64 72 2d 31 2c 20 73 71 6c  sub.iAddr-1, sql
19340 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19350 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 7d 0a 0a  ddr(v)-1);.  }..
19360 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
19370 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19380 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
19390 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
193a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
193b0 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20  ./*.** Expr pIn 
193c0 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78  is an IN(...) ex
193d0 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66  pression. This f
193e0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74  unction checks t
193f0 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d  hat the .** sub-
19400 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48  select on the RH
19410 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70  S of the IN() op
19420 65 72 61 74 6f 72 20 68 61 73 20 74 68 65 20 73  erator has the s
19430 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  ame number of .*
19440 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65  * columns as the
19450 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c   vector on the L
19460 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52  HS. Or, if the R
19470 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69  HS of the IN() i
19480 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d  s not .** a sub-
19490 71 75 65 72 79 2c 20 74 68 61 74 20 74 68 65 20  query, that the 
194a0 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f 72 20  LHS is a vector 
194b0 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e  of size 1..*/.in
194c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
194d0 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72  ckIN(Parse *pPar
194e0 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a  se, Expr *pIn){.
194f0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20    int nVector = 
19500 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
19510 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74  rSize(pIn->pLeft
19520 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66  );.  if( (pIn->f
19530 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
19540 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ect) ){.    if( 
19550 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e  nVector!=pIn->x.
19560 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
19570 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
19580 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
19590 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49  Error(pParse, pI
195a0 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
195b0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65  List->nExpr, nVe
195c0 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ctor);.      ret
195d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
195e0 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72  else if( nVector
195f0 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
19600 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
19610 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 70 4c  (pParse, pIn->pL
19620 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eft);.    return
19630 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
19640 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
19650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19660 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
19670 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
19680 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
19690 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
196a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
196b0 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
196c0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
196d0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
196e0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
196f0 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 6f 72  ) is a scalar or
19700 20 76 65 63 74 6f 72 20 65 78 70 72 65 73 73 69   vector expressi
19710 6f 6e 2e 20 20 54 68 65 20 0a 2a 2a 20 72 69 67  on.  The .** rig
19720 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
19730 53 29 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  S) is an array o
19740 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  f zero or more s
19750 63 61 6c 61 72 20 76 61 6c 75 65 73 2c 20 6f 72  calar values, or
19760 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 2e 20   a.** subquery. 
19770 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
19780 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 20 6e   subquery, the n
19790 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
197a0 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 0a 2a 2a 20  columns must.** 
197b0 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
197c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
197d0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
197e0 20 4c 48 53 2e 20 20 49 66 20 74 68 65 20 52 48   LHS.  If the RH
197f0 53 20 69 73 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  S is.** a list o
19800 66 20 76 61 6c 75 65 73 2c 20 74 68 65 20 4c 48  f values, the LH
19810 53 20 6d 75 73 74 20 62 65 20 61 20 73 63 61 6c  S must be a scal
19820 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49  ar. .**.** The I
19830 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 74 72  N operator is tr
19840 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 76 61  ue if the LHS va
19850 6c 75 65 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  lue is contained
19860 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
19870 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
19880 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 4c  s false if the L
19890 48 53 20 69 73 20 64 65 66 69 6e 69 74 65 6c 79  HS is definitely
198a0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 48 53 2e   not in the RHS.
198b0 20 20 54 68 65 20 0a 2a 2a 20 72 65 73 75 6c 74    The .** result
198c0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
198d0 70 72 65 73 65 6e 63 65 20 6f 66 20 74 68 65 20  presence of the 
198e0 4c 48 53 20 69 6e 20 74 68 65 20 52 48 53 20 63  LHS in the RHS c
198f0 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 64 65 74  annot be .** det
19900 65 72 6d 69 6e 65 64 20 64 75 65 20 74 6f 20 4e  ermined due to N
19910 55 4c 4c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ULLs..**.** This
19920 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
19930 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
19940 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
19950 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
19960 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
19970 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
19980 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
19990 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
199a0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
199b0 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
199c0 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
199d0 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
199e0 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
199f0 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
19a00 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
19a10 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
19a20 67 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  gh..**.** See th
19a30 65 20 73 65 70 61 72 61 74 65 20 69 6e 2d 6f 70  e separate in-op
19a40 65 72 61 74 6f 72 2e 6d 64 20 64 6f 63 75 6d 65  erator.md docume
19a50 6e 74 61 74 69 6f 6e 20 66 69 6c 65 20 69 6e 20  ntation file in 
19a60 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
19a70 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74   SQLite source t
19a80 72 65 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ree for addition
19a90 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19aa0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
19ab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19ac0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19ad0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
19ae0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
19af0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19b00 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
19b10 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
19b20 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
19b30 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
19b40 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
19b50 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
19b60 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
19b70 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
19b80 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
19b90 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
19ba0 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
19bb0 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
19bc0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
19bd0 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
19be0 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
19bf0 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
19c00 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
19c10 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
19c20 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  /.  int eType;  
19c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
19c40 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a  e of the RHS */.
19c50 20 20 69 6e 74 20 72 4c 68 73 3b 20 20 20 20 20    int rLhs;     
19c60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
19c70 74 65 72 28 73 29 20 68 6f 6c 64 69 6e 67 20 74  ter(s) holding t
19c80 68 65 20 4c 48 53 20 76 61 6c 75 65 73 20 2a 2f  he LHS values */
19c90 0a 20 20 69 6e 74 20 72 4c 68 73 4f 72 69 67 3b  .  int rLhsOrig;
19ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
19cb0 76 61 6c 75 65 73 20 70 72 69 6f 72 20 74 6f 20  values prior to 
19cc0 72 65 6f 72 64 65 72 69 6e 67 20 62 79 20 61 69  reordering by ai
19cd0 4d 61 70 5b 5d 20 2a 2f 0a 20 20 56 64 62 65 20  Map[] */.  Vdbe 
19ce0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
19cf0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
19d00 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
19d10 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
19d20 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
19d30 61 70 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66  ap from vector f
19d40 69 65 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f  ield to index co
19d50 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
19d60 7a 41 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  zAff = 0;       
19d70 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
19d80 6e 67 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ng for compariso
19d90 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63  ns */.  int nVec
19da0 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tor;          /*
19db0 20 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73   Size of vectors
19dc0 20 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65   for this IN ope
19dd0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  rator */.  int i
19de0 44 75 6d 6d 79 3b 20 20 20 20 20 20 20 20 20 20  Dummy;          
19df0 20 2f 2a 20 44 75 6d 6d 79 20 70 61 72 61 6d 65   /* Dummy parame
19e00 74 65 72 20 74 6f 20 65 78 70 72 43 6f 64 65 56  ter to exprCodeV
19e10 65 63 74 6f 72 28 29 20 2a 2f 0a 20 20 45 78 70  ector() */.  Exp
19e20 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
19e30 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66     /* The LHS of
19e40 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
19e50 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
19e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
19e70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
19e80 20 69 6e 74 20 64 65 73 74 53 74 65 70 32 3b 20   int destStep2; 
19e90 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
19ea0 74 6f 20 6a 75 6d 70 20 77 68 65 6e 20 4e 55 4c  to jump when NUL
19eb0 4c 73 20 73 65 65 6e 20 69 6e 20 73 74 65 70 20  Ls seen in step 
19ec0 32 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 53  2 */.  int destS
19ed0 74 65 70 36 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tep6 = 0;    /* 
19ee0 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20 66 6f  Start of code fo
19ef0 72 20 53 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e  r Step 6 */.  in
19f00 74 20 61 64 64 72 54 72 75 74 68 4f 70 3b 20 20  t addrTruthOp;  
19f10 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19f20 66 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 65  f opcode that de
19f30 74 65 72 6d 69 6e 65 73 20 74 68 65 20 49 4e 20  termines the IN 
19f40 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
19f50 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 3b 20 20 20   destNotNull;   
19f60 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
19f70 69 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  if a comparison 
19f80 69 73 20 6e 6f 74 20 74 72 75 65 20 69 6e 20 73  is not true in s
19f90 74 65 70 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61  tep 6 */.  int a
19fa0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
19fb0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 73   /* Top of the s
19fc0 74 65 70 2d 36 20 6c 6f 6f 70 20 2a 2f 20 0a 20  tep-6 loop */ . 
19fd0 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 20 20   int iTab = 0;  
19fe0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19ff0 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 70 4c 65  to use */..  pLe
1a000 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
1a010 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
1a020 45 78 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72  ExprCheckIN(pPar
1a030 73 65 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  se, pExpr) ) ret
1a040 75 72 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78  urn;.  zAff = ex
1a050 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
1a060 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e  rse, pExpr);.  n
1a070 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
1a080 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
1a090 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1a0a0 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
1a0b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1a0c0 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
1a0d0 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
1a0e0 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
1a0f0 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
1a100 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1a110 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1a120 64 20 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33  d ) goto sqlite3
1a130 45 78 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65  ExprCodeIN_oom_e
1a140 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  rror;..  /* Atte
1a150 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
1a160 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
1a170 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
1a180 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
1a190 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
1a1a0 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
1a1b0 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
1a1c0 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 54 61   with cursor iTa
1a1d0 62 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  b.  ** contains 
1a1e0 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
1a1f0 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
1a200 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
1a210 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
1a220 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
1a230 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
1a240 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
1a250 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
1a260 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
1a270 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
1a280 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
1a290 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
1a2a0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a2b0 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
1a2c0 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
1a2d0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
1a2e0 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
1a2f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
1a320 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
1a330 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
1a360 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
1a370 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
1a380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 69                ai
1a3a0 4d 61 70 2c 20 26 69 54 61 62 29 3b 0a 0a 20 20  Map, &iTab);..  
1a3b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1a3c0 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d  nErr || nVector=
1a3d0 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  =1 || eType==IN_
1a3e0 49 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20  INDEX_EPH.      
1a3f0 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
1a400 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c  DEX_INDEX_ASC ||
1a410 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
1a420 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29  _INDEX_DESC .  )
1a430 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a440 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f 6e 66 69  DEBUG.  /* Confi
1a450 72 6d 20 74 68 61 74 20 61 69 4d 61 70 5b 5d 20  rm that aiMap[] 
1a460 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63 74 6f 72  contains nVector
1a470 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
1a480 62 65 74 77 65 65 6e 20 30 20 61 6e 64 0a 20 20  between 0 and.  
1a490 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e 20 2a 2f  ** nVector-1. */
1a4a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1a4b0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
1a4c0 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a 20 20 20   int j, cnt;.   
1a4d0 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b 20 6a 3c   for(cnt=j=0; j<
1a4e0 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29 20 69 66  nVector; j++) if
1a4f0 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69 20 29 20  ( aiMap[j]==i ) 
1a500 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  cnt++;.    asser
1a510 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a 20 20 7d  t( cnt==1 );.  }
1a520 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
1a530 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
1a540 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
1a550 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49  pr> IN (...)". I
1a560 66 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a  f the LHS is a .
1a570 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65    ** vector, the
1a580 6e 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  n it is stored i
1a590 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56  n an array of nV
1a5a0 65 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  ector registers 
1a5b0 73 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61  starting .  ** a
1a5c0 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t r1..  **.  ** 
1a5d0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a5e0 65 78 28 29 20 6d 69 67 68 74 20 68 61 76 65 20  ex() might have 
1a5f0 72 65 6f 72 64 65 72 65 64 20 74 68 65 20 66 69  reordered the fi
1a600 65 6c 64 73 20 6f 66 20 74 68 65 20 4c 48 53 20  elds of the LHS 
1a610 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73 6f 20 74  vector.  ** so t
1a620 68 61 74 20 74 68 65 20 66 69 65 6c 64 73 20 61  hat the fields a
1a630 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f  re in the same o
1a640 72 64 65 72 20 61 73 20 61 6e 20 65 78 69 73 74  rder as an exist
1a650 69 6e 67 20 69 6e 64 65 78 2e 20 20 20 54 68 65  ing index.   The
1a660 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d 20 61 72  .  ** aiMap[] ar
1a670 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ray contains a m
1a680 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
1a690 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20 66 69 65  original LHS fie
1a6a0 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  ld order to.  **
1a6b0 20 74 68 65 20 66 69 65 6c 64 20 6f 72 64 65 72   the field order
1a6c0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
1a6d0 65 20 52 48 53 20 69 6e 64 65 78 2e 0a 20 20 2a  e RHS index..  *
1a6e0 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20 3d 20 65  /.  rLhsOrig = e
1a6f0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
1a700 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 69 44  arse, pLeft, &iD
1a710 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ummy);.  for(i=0
1a720 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26 26 20 61  ; i<nVector && a
1a730 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69 2b 2b 29  iMap[i]==i; i++)
1a740 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53 20 66 69  {} /* Are LHS fi
1a750 65 6c 64 73 20 72 65 6f 72 64 65 72 65 64 3f 20  elds reordered? 
1a760 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e 56 65 63  */.  if( i==nVec
1a770 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 48  tor ){.    /* LH
1a780 53 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  S fields are not
1a790 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
1a7a0 20 20 72 4c 68 73 20 3d 20 72 4c 68 73 4f 72 69    rLhs = rLhsOri
1a7b0 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1a7c0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 6f 72 64  /* Need to reord
1a7d0 65 72 20 74 68 65 20 4c 48 53 20 66 69 65 6c 64  er the LHS field
1a7e0 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  s according to a
1a7f0 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72 4c 68 73  iMap */.    rLhs
1a800 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a810 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1a820 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  Vector);.    for
1a830 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1a840 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1a850 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a860 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c 68 73 4f  , OP_Copy, rLhsO
1a870 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61 69 4d 61  rig+i, rLhs+aiMa
1a880 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
1a890 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c    }..  /* If sql
1a8a0 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
1a8b0 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
1a8c0 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
1a8d0 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
1a8e0 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
1a8f0 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
1a900 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
1a910 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
1a920 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
1a930 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2a  omparisons..  **
1a940 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 74  .  ** This is st
1a950 65 70 20 28 31 29 20 69 6e 20 74 68 65 20 69 6e  ep (1) in the in
1a960 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20 6f 70 74  -operator.md opt
1a970 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69 74 68 6d  imized algorithm
1a980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1a990 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
1a9a0 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
1a9b0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1a9c0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
1a9d0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1a9e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1a9f0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
1aa00 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
1aa10 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
1aa20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1aa30 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e  (pParse);.    in
1aa40 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
1aa50 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
1aa60 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
1aa70 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
1aa80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1aa90 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1aaa0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1aab0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
1aac0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
1aad0 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
1aae0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1aaf0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1ab00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ab10 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
1ab20 4c 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b  Lhs, rLhs, regCk
1ab30 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
1ab40 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
1ab50 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
1ab60 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
1ab70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1ab80 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
1ab90 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
1aba0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
1abb0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
1abc0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
1abd0 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
1abe0 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
1abf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ac00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
1ac10 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
1ac20 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
1ac30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ac40 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
1ac50 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
1ac60 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
1ac70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ac80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1ac90 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61 62  OP_Eq, rLhs, lab
1aca0 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
1acd0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1ace0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1acf0 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
1ad00 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1ad10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ad20 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
1ad30 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
1ad40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1ad50 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66 5b  hangeP5(v, zAff[
1ad60 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
1ad70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1ad80 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
1ad90 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
1ada0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1adb0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
1adc0 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61 6c   rLhs, destIfFal
1add0 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1ae00 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
1ae10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ae20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ae30 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66  eChangeP5(v, zAf
1ae40 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a 55  f[0] | SQLITE_JU
1ae50 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1ae60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1ae70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1ae80 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
1ae90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1aea0 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
1aeb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1aed0 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
1aee0 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
1aef0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1af00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1af10 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
1af20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1af30 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1af40 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
1af50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1af60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1af70 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
1af80 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65  .    goto sqlite
1af90 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1afa0 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  shed;.  }..  /* 
1afb0 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74 6f  Step 2: Check to
1afc0 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
1afd0 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
1afe0 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20 74  L columns.  If t
1aff0 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65 73  he.  ** LHS does
1b000 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20 74   contain NULLs t
1b010 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
1b020 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46 41  ust be either FA
1b030 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20 2a  LSE or NULL..  *
1b040 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20 73  * We will then s
1b050 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20 73  kip the binary s
1b060 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48 53  earch of the RHS
1b070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
1b080 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1b090 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73 74  alse ){.    dest
1b0a0 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46 61  Step2 = destIfFa
1b0b0 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lse;.  }else{.  
1b0c0 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64 65    destStep2 = de
1b0d0 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74 65  stStep6 = sqlite
1b0e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
1b0f0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  Parse);.  }.  fo
1b100 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
1b110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1b120 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63   *p = sqlite3Vec
1b130 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
1b140 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
1b150 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1b160 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1b170 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1b180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b190 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73 2b  OP_IsNull, rLhs+
1b1a0 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a 20  i, destStep2);. 
1b1b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1b1c0 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
1b1d0 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20 54  .  /* Step 3.  T
1b1e0 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b 6e  he LHS is now kn
1b1f0 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55  own to be non-NU
1b200 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e 61  LL.  Do the bina
1b210 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 6f  ry search.  ** o
1b220 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67 20  f the RHS using 
1b230 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72 6f  the LHS as a pro
1b240 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20 74  be.  If found, t
1b250 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20 2a  he result is.  *
1b260 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 69  * true..  */.  i
1b270 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
1b280 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
1b290 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
1b2a0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
1b2b0 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
1b2c0 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65 20  -tree and so we 
1b2d0 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f 77  also.    ** know
1b2e0 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69 73   that the RHS is
1b2f0 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e 63   non-NULL.  Henc
1b300 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73 74  e, we combine st
1b310 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  eps 3 and 4.    
1b320 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ** into a single
1b330 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
1b340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b350 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
1b360 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1b370 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20  alse, rLhs);.   
1b380 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b390 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f  ;.    addrTruthO
1b3a0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1b3b0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
1b3c0 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72  );  /* Return Tr
1b3d0 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ue */.  }else{. 
1b3e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b3f0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
1b400 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74  ity, rLhs, nVect
1b410 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65  or, 0, zAff, nVe
1b420 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64  ctor);.    if( d
1b430 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1b440 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  IfNull ){.      
1b450 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20  /* Combine Step 
1b460 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74  3 and Step 5 int
1b470 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  o a single opcod
1b480 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
1b490 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1b4a0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
1b4b0 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c 73  iTab, destIfFals
1b4c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 4c                rL
1b4e0 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56 64  hs, nVector); Vd
1b4f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b500 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74 65       goto sqlite
1b510 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e 69  3ExprCodeIN_fini
1b520 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
1b530 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65 70  /* Ordinary Step
1b540 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73 65   3, for the case
1b550 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e 64   where FALSE and
1b560 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69 6e   NULL are distin
1b570 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54 72  ct */.    addrTr
1b580 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33 56  uthOp = sqlite3V
1b590 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
1b5a0 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
1b5b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20 6e           rLhs, n
1b5e0 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f 76  Vector); VdbeCov
1b5f0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
1b600 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66 20   /* Step 4.  If 
1b610 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77 6e  the RHS is known
1b620 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20   to be non-NULL 
1b630 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20 66  and we did not f
1b640 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74 63  ind.  ** an matc
1b650 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 20  h on the search 
1b660 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
1b670 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 46  result must be F
1b680 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALSE..  */.  if(
1b690 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20   rRhsHasNull && 
1b6a0 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20 20  nVector==1 ){.  
1b6b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b6c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
1b6d0 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
1b6e0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1b6f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1b700 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65  );.  }..  /* Ste
1b710 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  p 5.  If we do n
1b720 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1b730 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1b740 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  ween NULL and.  
1b750 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20 6a  ** FALSE, then j
1b760 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ust return false
1b770 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  . .  */.  if( de
1b780 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b790 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33 56  fNull ) sqlite3V
1b7a0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
1b7b0 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20 53  fFalse);..  /* S
1b7c0 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72 6f  tep 6: Loop thro
1b7d0 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ugh rows of the 
1b7e0 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65 61  RHS.  Compare ea
1b7f0 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c 48  ch row to the LH
1b800 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 63  S..  ** If any c
1b810 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55 4c  omparison is NUL
1b820 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
1b830 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  lt is NULL.  If 
1b840 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72 69  all.  ** compari
1b850 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20 74  sons are FALSE t
1b860 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72 65  hen the final re
1b870 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a 20  sult is FALSE.. 
1b880 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 73   **.  ** For a s
1b890 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69 73  calar LHS, it is
1b8a0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 63   sufficient to c
1b8b0 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66 69  heck just the fi
1b8c0 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66 20  rst row.  ** of 
1b8d0 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
1b8e0 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29 20  if( destStep6 ) 
1b8f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b900 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 53  veLabel(v, destS
1b910 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f 70  tep6);.  addrTop
1b920 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b930 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
1b940 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66 46  d, iTab, destIfF
1b950 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  alse);.  VdbeCov
1b960 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
1b970 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1b980 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20 73   destNotNull = s
1b990 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b9a0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  bel(pParse);.  }
1b9b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
1b9c0 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f 6d   nVector==1, com
1b9d0 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e 64  bine steps 6 and
1b9e0 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65 6c   7 by immediatel
1b9f0 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  y returning.    
1ba00 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
1ba10 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e  first comparison
1ba20 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   is not NULL */.
1ba30 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20      destNotNull 
1ba40 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  = destIfFalse;. 
1ba50 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1ba60 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
1ba70 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
1ba80 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ba90 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71 6c      int r3 = sql
1baa0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1bab0 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d 20  Parse);.    p = 
1bac0 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
1bad0 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c  ldSubexpr(pLeft,
1bae0 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   i);.    pColl =
1baf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1bb00 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
1bb10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bb20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
1bb30 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33 29  mn, iTab, i, r3)
1bb40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bb50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1bb60 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f  , rLhs+i, destNo
1bb70 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20  tNull, r3,.     
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
1bba0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1bbb0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1bbc0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1bbd0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1bbe0 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71  e, r3);.  }.  sq
1bbf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bc00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1bc10 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66  estIfNull);.  if
1bc20 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20  ( nVector>1 ){. 
1bc30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1bc40 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1bc50 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20  stNotNull);.    
1bc60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bc70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
1bc80 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a  ab, addrTop+1);.
1bc90 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1bca0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 65  (v);..    /* Ste
1bcb0 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61 63  p 7:  If we reac
1bcc0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  h this point, we
1bcd0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72   know that the r
1bce0 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20 2a  esult must.    *
1bcf0 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a 20  * be false. */. 
1bd00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd10 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1bd20 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
1bd30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
1bd40 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  s here in order 
1bd50 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  to return true. 
1bd60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1bd70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1bd80 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69 74  TruthOp);..sqlit
1bd90 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1bda0 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c 68  ished:.  if( rLh
1bdb0 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73 71  s!=rLhsOrig ) sq
1bdc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1bdd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68 73  Reg(pParse, rLhs
1bde0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1bdf0 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
1be00 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78 70  r"));.sqlite3Exp
1be10 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f  rCodeIN_oom_erro
1be20 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
1be30 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 61  ee(pParse->db, a
1be40 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  iMap);.  sqlite3
1be50 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1be60 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e 64  b, zAff);.}.#end
1be70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1be80 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
1be90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bea0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1beb0 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
1bec0 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1bed0 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1bee0 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
1bef0 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
1bf00 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
1bf10 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1bf20 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
1bf30 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
1bf40 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
1bf50 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
1bf60 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
1bf70 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
1bf80 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1bf90 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
1bfa0 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
1bfb0 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
1bfc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
1bfd0 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
1bfe0 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
1bff0 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
1c000 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
1c010 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
1c020 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
1c030 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
1c040 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
1c050 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
1c060 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
1c070 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
1c080 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
1c090 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
1c0a0 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
1c0b0 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
1c0c0 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
1c0d0 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
1c0e0 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
1c0f0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
1c100 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
1c110 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
1c120 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
1c130 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
1c140 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
1c150 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
1c160 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
1c170 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
1c180 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
1c190 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
1c1a0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
1c1b0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
1c1c0 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
1c1d0 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
1c1e0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
1c1f0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
1c200 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
1c210 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1c220 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
1c230 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
1c240 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c250 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
1c260 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1c270 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
1c280 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
1c290 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
1c2a0 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
1c2b0 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
1c2c0 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
1c2d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c2e0 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
1c2f0 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
1c300 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
1c310 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
1c320 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
1c330 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1c340 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1c350 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
1c360 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
1c370 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
1c380 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67 46  ( (c==3 && !negF
1c390 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20 7c  lag) || (c==2) |
1c3a0 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76 61  | (negFlag && va
1c3b0 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  lue==SMALLEST_IN
1c3c0 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53 51  T64)){.#ifdef SQ
1c3d0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1c3e0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
1c3f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c400 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
1c410 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
1c420 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
1c430 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
1c440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c450 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
1c460 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c470 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
1c480 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
1c490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c4a0 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
1c4b0 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
1c4c0 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 3f   %s%s", negFlag?
1c4d0 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20 20  "-":"",z);.     
1c4e0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1c4f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
1c500 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
1c510 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
1c520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1c540 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
1c550 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c 4c  e = c==3 ? SMALL
1c560 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
1c570 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  ue; }.      sqli
1c580 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1c590 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  8(v, OP_Int64, 0
1c5a0 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
1c5b0 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34  &value, P4_INT64
1c5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1c5d0 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1c5e0 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
1c5f0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
1c600 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
1c610 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
1c620 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
1c630 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
1c640 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
1c650 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c660 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
1c670 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
1c680 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
1c690 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c6a0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
1c6b0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
1c6c0 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
1c6d0 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
1c6e0 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
1c6f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1c700 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
1c710 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
1c720 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
1c730 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c740 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
1c750 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
1c760 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
1c770 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
1c780 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
1c790 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1c7a0 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
1c7b0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
1c7c0 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
1c7d0 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
1c7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
1c7f0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
1c800 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c810 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
1c820 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
1c830 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1c840 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b 0a   = iTabCur + 1;.
1c850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c860 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1c870 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1c880 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1c890 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20 70  , regOut);.    p
1c8a0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
1c8b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c8c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c8d0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1c8e0 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
1c8f0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
1c900 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
1c930 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1c940 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1c950 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
1c960 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
1c970 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
1c980 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
1c990 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c9a0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1c9b0 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
1c9c0 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
1c9d0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
1c9e0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
1c9f0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
1ca00 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
1ca10 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1ca20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
1ca30 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
1ca40 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
1ca50 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
1ca60 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1ca70 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
1ca80 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1ca90 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
1caa0 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
1cab0 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
1cac0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
1cad0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
1cae0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  er */.){.  if( p
1caf0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1cb00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb10 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1cb20 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1cb30 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1cb40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1cb50 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1cb60 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1cb70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cb80 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1cb90 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1cba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1cbb0 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
1cbc0 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
1cbd0 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
1cbe0 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c      int x = iCol
1cbf0 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  ;.    if( !HasRo
1cc00 77 69 64 28 70 54 61 62 29 20 26 26 20 21 49 73  wid(pTab) && !Is
1cc10 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1cc20 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
1cc30 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1cc40 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
1cc50 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
1cc60 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
1cc70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cc80 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
1cc90 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
1cca0 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
1ccb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
1ccc0 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
1ccd0 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
1cce0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ccf0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1cd00 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
1cd10 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
1cd20 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
1cd30 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
1cd40 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
1cd50 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1cd60 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  iReg. .**.** The
1cd70 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
1cd80 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
1cd90 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
1cda0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1cdb0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
1cdc0 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
1cdd0 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
1cde0 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
1cdf0 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  he rowid..*/.int
1ce00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ce10 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
1ce20 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
1ce30 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ce40 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ce50 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1ce60 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
1ce70 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1ce80 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
1ce90 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
1cea0 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
1ceb0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1cec0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
1ced0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cee0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1cef0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
1cf00 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
1cf10 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
1cf20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
1cf30 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20  ere */.  u8 p5  
1cf40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20            /* P5 
1cf50 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c  value for OP_Col
1cf60 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29  umn + FLAGS */.)
1cf70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cf80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
1cf90 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1cfa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cfb0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1cfc0 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1cfd0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1cfe0 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1cff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d000 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1d010 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
1d020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d030 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
1d040 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
1d050 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
1d060 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
1d070 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
1d080 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20  nReg-1..*/.void 
1d090 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1d0a0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
1d0b0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
1d0c0 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
1d0d0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
1d0e0 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
1d0f0 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
1d100 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1d110 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
1d120 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
1d130 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
1d140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1d150 74 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  t a scalar expre
1d160 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20  ssion node to a 
1d170 54 4b 5f 52 45 47 49 53 54 45 52 20 72 65 66 65  TK_REGISTER refe
1d180 72 65 6e 63 69 6e 67 0a 2a 2a 20 72 65 67 69 73  rencing.** regis
1d190 74 65 72 20 69 52 65 67 2e 20 20 54 68 65 20 63  ter iReg.  The c
1d1a0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1d1b0 65 20 74 68 61 74 20 69 52 65 67 20 61 6c 72 65  e that iReg alre
1d1c0 61 64 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ady contains.** 
1d1d0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
1d1e0 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
1d1f0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1d200 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
1d210 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
1d220 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
1d230 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
1d240 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
1d250 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
1d260 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
1d270 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
1d280 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  kip);.}../*.** E
1d290 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1d2a0 73 73 69 6f 6e 20 28 65 69 74 68 65 72 20 61 20  ssion (either a 
1d2b0 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61 6c  vector or a scal
1d2c0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 29 20 61  ar expression) a
1d2d0 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20  nd store.** the 
1d2e0 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e 74 69 6e  result in contin
1d2f0 67 75 6f 75 73 20 74 65 6d 70 6f 72 61 72 79 20  guous temporary 
1d300 72 65 67 69 73 74 65 72 73 2e 20 20 52 65 74 75  registers.  Retu
1d310 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
1d320 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
1d330 69 73 74 65 72 20 75 73 65 64 20 74 6f 20 73 74  ister used to st
1d340 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ore the result..
1d350 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
1d360 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72 65 67  urned result reg
1d370 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
1d380 72 61 72 79 20 73 63 61 6c 61 72 2c 20 74 68 65  rary scalar, the
1d390 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a 20  n also write.** 
1d3a0 74 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75  that register nu
1d3b0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69 46 72 65  mber into *piFre
1d3c0 65 61 62 6c 65 2e 20 20 49 66 20 74 68 65 20 72  eable.  If the r
1d3d0 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20 72  eturned result r
1d3e0 65 67 69 73 74 65 72 0a 2a 2a 20 69 73 20 6e 6f  egister.** is no
1d3f0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
1d400 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1d410 6f 6e 20 69 73 20 61 20 76 65 63 74 6f 72 20 73  on is a vector s
1d420 65 74 20 2a 70 69 46 72 65 65 61 62 6c 65 0a 2a  et *piFreeable.*
1d430 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  * to 0..*/.stati
1d440 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65 56 65  c int exprCodeVe
1d450 63 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ctor(Parse *pPar
1d460 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  se, Expr *p, int
1d470 20 2a 70 69 46 72 65 65 61 62 6c 65 29 7b 0a 20   *piFreeable){. 
1d480 20 69 6e 74 20 69 52 65 73 75 6c 74 3b 0a 20 20   int iResult;.  
1d490 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  int nResult = sq
1d4a0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
1d4b0 69 7a 65 28 70 29 3b 0a 20 20 69 66 28 20 6e 52  ize(p);.  if( nR
1d4c0 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20 20 20 20  esult==1 ){.    
1d4d0 69 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  iResult = sqlite
1d4e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1d4f0 61 72 73 65 2c 20 70 2c 20 70 69 46 72 65 65 61  arse, p, piFreea
1d500 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
1d510 20 20 20 2a 70 69 46 72 65 65 61 62 6c 65 20 3d     *piFreeable =
1d520 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   0;.    if( p->o
1d530 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
1d540 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  #if SQLITE_OMIT_
1d550 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 69  SUBQUERY.      i
1d560 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6c 73  Result = 0;.#els
1d570 65 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  e.      iResult 
1d580 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  = sqlite3CodeSub
1d590 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
1d5a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
1d5b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1d5c0 3b 0a 20 20 20 20 20 20 69 52 65 73 75 6c 74 20  ;.      iResult 
1d5d0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1d5e0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1d5f0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b  nMem += nResult;
1d600 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d610 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
1d620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d630 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1d640 6c 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e  le(pParse, p->x.
1d650 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1d660 72 2c 20 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20  r, i+iResult);. 
1d670 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d680 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 75 6c  .  return iResul
1d690 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t;.}.../*.** Gen
1d6a0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
1d6b0 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
1d6c0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1d6d0 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1d6e0 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
1d6f0 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1d700 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1d710 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
1d720 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1d730 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
1d740 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1d750 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
1d760 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
1d770 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
1d780 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
1d790 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
1d7a0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
1d7b0 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
1d7c0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
1d7d0 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
1d7e0 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1d7f0 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
1d800 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1d810 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
1d820 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
1d830 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
1d840 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
1d850 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
1d860 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1d870 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
1d880 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1d890 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1d8a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1d8b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
1d8c0 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
1d8d0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1d8e0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1d8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d900 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1d910 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
1d920 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
1d930 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
1d940 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1d950 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
1d960 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
1d970 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1d980 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1d990 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1d9a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
1d9b0 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
1d9c0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1d9d0 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1d9e0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1d9f0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20  .  int r1, r2;  
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da10 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
1da20 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78   numbers */.  Ex
1da30 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1da40 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1da50 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1da60 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1da70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1da80 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1da90 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1daa0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1dab0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1dac0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1dad0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1dae0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78  eturn 0;.  }..ex
1daf0 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a  pr_code_doover:.
1db00 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1db10 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
1db20 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
1db30 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1db40 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
1db50 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1db60 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
1db70 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
1db80 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
1db90 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1dba0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
1dbb0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
1dbc0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
1dbd0 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
1dbe0 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
1dbf0 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
1dc00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
1dc10 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
1dc20 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d      return pCol-
1dc30 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  >iMem;.      }el
1dc40 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
1dc50 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
1dc60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1dc70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1dc80 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
1dc90 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54  fo->sortingIdxPT
1dca0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1dcd0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1dce0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1dcf0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1dd00 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1dd10 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1dd20 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1dd30 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1dd40 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1dd50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1dd60 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1dd70 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  le;.      if( Ex
1dd80 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1dd90 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
1dda0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1ddb0 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72  This COLUMN expr
1ddc0 65 73 73 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79  ession is really
1ddd0 20 61 20 63 6f 6e 73 74 61 6e 74 20 64 75 65 20   a constant due 
1dde0 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  to WHERE clause.
1ddf0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1de00 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 61 74  raints, and that
1de10 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 63 6f 64   constant is cod
1de20 65 64 20 62 79 20 74 68 65 20 70 45 78 70 72 2d  ed by the pExpr-
1de30 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  >pLeft.        *
1de40 2a 20 65 78 70 72 65 73 73 73 69 6f 6e 2e 20 20  * expresssion.  
1de50 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65 20 73 75  However, make su
1de60 72 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  re the constant 
1de70 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 0a  has the correct.
1de80 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 74          ** datat
1de90 79 70 65 20 62 79 20 61 70 70 6c 79 69 6e 67 20  ype by applying 
1dea0 74 68 65 20 41 66 66 69 6e 69 74 79 20 6f 66 20  the Affinity of 
1deb0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
1dec0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
1ded0 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20  ** constant..   
1dee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1def0 69 6e 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74  int iReg = sqlit
1df00 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1df10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1df20 70 4c 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20  pLeft,target);. 
1df30 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 20 3d         int aff =
1df40 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
1df50 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  umnAffinity(pExp
1df60 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45 78 70 72  r->y.pTab, pExpr
1df70 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1df80 20 20 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c      if( aff!=SQL
1df90 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a  ITE_AFF_BLOB ){.
1dfa0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
1dfb0 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66   const char zAff
1dfc0 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30  [] = "B\000C\000
1dfd0 44 5c 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20  D\000E";.       
1dfe0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1dff0 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20  E_AFF_BLOB=='A' 
1e000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1e010 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f  ert( SQLITE_AFF_
1e020 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20  TEXT=='B' );.   
1e030 20 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21         if( iReg!
1e040 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1e050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e060 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1e070 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67  Copy, iReg, targ
1e080 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
1e090 20 69 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a   iReg = target;.
1e0a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e0c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
1e0d0 66 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c  finity, iReg, 1,
1e0e0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 26 7a 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a  &zAff[(aff-'B')*
1e110 32 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  2], P4_STATIC);.
1e120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e130 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20    return iReg;. 
1e140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e150 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
1e160 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
1e170 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20  SelfTab<0 ){.   
1e180 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
1e190 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74  ting CHECK const
1e1a0 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74  raints or insert
1e1b0 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c  ing into partial
1e1c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
1e1d0 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
1e1e0 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72  ->iColumn - pPar
1e1f0 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20  se->iSelfTab;.  
1e200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e210 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67         /* Coding
1e220 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1e230 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1e240 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f  n index where co
1e250 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20  lumn names.     
1e260 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
1e270 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68  ndex refer to th
1e280 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
1e290 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
1e2a0 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
1e2b0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
1e2c0 53 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20  SelfTab - 1;.   
1e2d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e2e0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1e2f0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1e300 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
1e310 70 72 2d 3e 79 2e 70 54 61 62 2c 0a 20 20 20 20  pr->y.pTab,.    
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1e340 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
1e350 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e370 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1e380 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  p2);.    }.    c
1e390 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
1e3a0 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
1e3b0 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ger(pParse, pExp
1e3c0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1e3d0 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e3e0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  et;.    }.    ca
1e3f0 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 3a  se TK_TRUEFALSE:
1e400 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1e410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e420 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65  _Integer, sqlite
1e430 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
1e440 70 45 78 70 72 29 2c 20 74 61 72 67 65 74 29 3b  pExpr), target);
1e450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e460 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1e470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e480 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1e490 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1e4a0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e4b0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e4c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e4d0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e4e0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
1e4f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1e500 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1e510 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
1e520 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1e530 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1e540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e550 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e560 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e570 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
1e580 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1e590 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
1e5a0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1e5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
1e5c0 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  get;.    }.    c
1e5d0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1e5e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e5f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1e600 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1e610 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1e620 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  et;.    }.#ifnde
1e630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
1e640 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
1e650 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
1e660 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
1e670 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1e680 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
1e690 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
1e6a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e6b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1e6c0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1e6d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1e6e0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
1e6f0 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
1e700 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
1e710 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e720 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
1e730 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
1e740 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
1e750 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
1e760 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e770 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
1e780 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
1e790 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
1e7a0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
1e7b0 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
1e7c0 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
1e7d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e7e0 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
1e7f0 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
1e800 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
1e810 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  IC);.      retur
1e820 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1e830 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1e840 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1e850 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1e860 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e870 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1e880 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1e890 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e8a0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
1e8b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1e8c0 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
1e8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e8e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
1e8f0 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
1e900 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
1e910 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1e920 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
1e930 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1e940 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1e950 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d  te3VListNumToNam
1e960 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  e(pParse->pVList
1e970 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1e980 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1e990 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1e9a0 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74  en[0]=='?' || st
1e9b0 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
1e9c0 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20  oken, z)==0 );. 
1e9d0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
1e9e0 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a  VList[0] = 0; /*
1e9f0 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73 74 20   Indicate VList 
1ea00 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  may no longer be
1ea10 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 20   enlarged */.   
1ea20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ea30 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63 68 61  AppendP4(v, (cha
1ea40 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49 43 29  r*)z, P4_STATIC)
1ea50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ea60 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
1ea70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ea80 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1ea90 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1eaa0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 23  >iTable;.    }.#
1eab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1eac0 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1ead0 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1eae0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1eaf0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1eb00 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1eb10 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
1eb20 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1eb30 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1eb40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1eb50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1eb60 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1eb70 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1eb80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1eb90 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
1eba0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1ebb0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1ebc0 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1ebd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ebe0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
1ebf0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1ec20 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1ec30 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
1ec40 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 20   return inReg;. 
1ec50 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1ec60 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
1ec70 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
1ec80 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1ec90 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20 3d  SNOT:.      op =
1eca0 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
1ecb0 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
1ecc0 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45 5f      p5 = SQLITE_
1ecd0 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
1ece0 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a 2f   fall-through */
1ecf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1ed00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1ed10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1ed20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1ed30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1ed40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1ed50 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1ed60 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
1ed70 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eft;.      if( s
1ed80 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1ed90 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  or(pLeft) ){.   
1eda0 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72 43       codeVectorC
1edb0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1edc0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f 70  Expr, target, op
1edd0 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , p5);.      }el
1ede0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1edf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ee00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65  Temp(pParse, pLe
1ee10 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1ee20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
1ee30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ee40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ee50 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1ee60 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  2);.        code
1ee70 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1ee80 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1ee90 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1eea0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
1eeb0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
1eec0 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20 20  EP2 | p5);.     
1eed0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1eee0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1eef0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1ef00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ef10 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1ef20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1ef30 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1ef40 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1ef50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ef60 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1ef70 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1ef80 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1ef90 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1efa0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1efb0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1efc0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1efd0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1efe0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1eff0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f000 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1f010 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1f020 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1f030 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1f040 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f050 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1f060 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1f070 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1f080 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1f090 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f0a0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1f0b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f0c0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f0d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f0e0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f0f0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f110 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
1f120 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
1f130 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
1f140 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
1f150 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
1f160 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1f170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1f180 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
1f190 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
1f1a0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
1f1b0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
1f1c0 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
1f1d0 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
1f1e0 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
1f1f0 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
1f200 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
1f210 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f220 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
1f230 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
1f240 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
1f250 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f260 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
1f270 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f280 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
1f290 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1f2a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
1f2b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f2c0 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
1f2d0 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
1f2e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
1f2f0 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
1f300 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
1f310 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
1f320 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f330 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
1f340 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
1f350 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
1f360 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f370 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
1f380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f390 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
1f3a0 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
1f3b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
1f3c0 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
1f3d0 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
1f3e0 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
1f3f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f400 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
1f410 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
1f420 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
1f430 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1f440 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
1f450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f460 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
1f470 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
1f480 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
1f490 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
1f4a0 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
1f4b0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
1f4c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f4d0 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
1f4e0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f4f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f500 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f510 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f520 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f530 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f540 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f550 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f570 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
1f580 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1f590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f5a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f5b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f5c0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f5d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f5e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1f5f0 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
1f600 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
1f610 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
1f620 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
1f630 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
1f640 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
1f650 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
1f660 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1f670 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
1f680 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f690 20 74 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66   target;.#ifndef
1f6a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1f6b0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1f6c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
1f6d0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
1f6e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1f6f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1f700 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1f710 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f720 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
1f730 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Left->u.zToken, 
1f740 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1f750 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65      return targe
1f760 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t;.#endif.      
1f770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
1f780 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54  empX.op = TK_INT
1f790 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65  EGER;.        te
1f7a0 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49  mpX.flags = EP_I
1f7b0 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e  ntValue|EP_Token
1f7c0 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65  Only;.        te
1f7d0 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30  mpX.u.iValue = 0
1f7e0 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
1f7f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f800 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  mp(pParse, &temp
1f810 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
1f820 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
1f830 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f840 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f850 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
1f860 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f870 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f880 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
1f890 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
1f8a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f8b0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1f8d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f8e0 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
1f8f0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1f900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f910 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
1f920 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
1f930 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
1f940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f950 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
1f960 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
1f970 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
1f980 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f990 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f9a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f9b0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f9c0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
1f9d0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f9e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f9f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
1fa00 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
1fa10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fa20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55  .    case TK_TRU
1fa30 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TH: {.      int 
1fa40 69 73 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53  isTrue;    /* IS
1fa50 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20   TRUE or IS NOT 
1fa60 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e  TRUE */.      in
1fa70 74 20 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20  t bNormal;   /* 
1fa80 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 46 41  IS TRUE or IS FA
1fa90 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20  LSE */.      r1 
1faa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fab0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fac0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fad0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
1fae0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1faf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 54  ==0 );.      isT
1fb00 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
1fb10 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1fb20 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1fb30 20 20 62 4e 6f 72 6d 61 6c 20 3d 20 70 45 78 70    bNormal = pExp
1fb40 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20  r->op2==TK_IS;. 
1fb50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1fb60 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61 6c  sTrue && bNormal
1fb70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fb80 65 28 20 21 69 73 54 72 75 65 20 26 26 20 62 4e  e( !isTrue && bN
1fb90 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 73 71  ormal);.      sq
1fba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
1fbb0 6e 74 28 76 2c 20 4f 50 5f 49 73 54 72 75 65 2c  nt(v, OP_IsTrue,
1fbc0 20 72 31 2c 20 69 6e 52 65 67 2c 20 21 69 73 54   r1, inReg, !isT
1fbd0 72 75 65 2c 20 69 73 54 72 75 65 20 5e 20 62 4e  rue, isTrue ^ bN
1fbe0 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  ormal);.      br
1fbf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fc00 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1fc10 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1fc20 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
1fc30 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
1fc40 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1fc50 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1fc60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1fc70 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1fc80 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1fc90 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1fca0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fcb0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1fcc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fcd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1fce0 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
1fcf0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fd00 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fd10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fd20 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fd30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fd40 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fd50 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1fd60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1fd70 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
1fd80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fd90 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1fda0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1fdb0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1fdc0 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
1fdd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fde0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1fdf0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
1fe00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fe10 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1fe20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fe30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fe40 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
1fe50 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1fe60 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
1fe70 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1fe80 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
1fe90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fea0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1feb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1fec0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1fed0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1fee0 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
1fef0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
1ff00 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
1ff10 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
1ff20 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1ff30 72 6e 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  rn pInfo->aFunc[
1ff40 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
1ff50 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1ff60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ff70 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1ff80 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1ff90 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1ffa0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1ffb0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1ffc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
1ffd0 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
1ffe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
1fff0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
20000 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
20010 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
20020 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
20030 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
20040 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
20050 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
20060 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
20070 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
20080 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
20090 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
200a0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
200b0 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
200c0 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
200d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
200e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
200f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
20100 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20110 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
20120 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
20130 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ection */.      
20140 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
20150 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
20160 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
20170 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
20180 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
20190 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
201a0 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
201b0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 23 69   sequence */..#i
201c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
201d0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
201e0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
201f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
20200 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
20210 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
20220 72 2d 3e 79 2e 70 57 69 6e 2d 3e 72 65 67 52 65  r->y.pWin->regRe
20230 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65  sult;.      }.#e
20240 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
20250 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
20260 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33  arse) && sqlite3
20270 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
20280 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
20290 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66          /* SQL f
202a0 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
202b0 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72  expensive. So tr
202c0 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61  y to move consta
202d0 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  nt functions.   
202e0 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74       ** out of t
202f0 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65  he inner loop, e
20300 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
20310 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f  s an extra OP_Co
20320 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  py. */.        r
20330 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
20340 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
20350 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a  se, pExpr, -1);.
20360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20370 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
20380 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
20390 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
203a0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
203b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
203c0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
203d0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
203e0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
203f0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
20400 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
20410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
20420 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
20430 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
20440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
20450 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20460 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
20470 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
20480 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
20490 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
204a0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
204b0 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
204c0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
204d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
204e0 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
204f0 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
20500 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
20510 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
20520 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
20530 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
20540 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
20550 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
20560 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
20570 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
20580 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
20590 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
205a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
205b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
205c0 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
205d0 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
205e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
205f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
20600 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
20610 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20620 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
20630 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
20640 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
20650 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
20660 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
20670 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
20680 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
20690 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
206a0 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
206b0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
206c0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
206d0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
206e0 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
206f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
20700 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
20710 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20720 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20730 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
20740 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
20750 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
20760 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
20770 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
20780 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20790 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
207a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
207b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
207c0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
207d0 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
207e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
207f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20810 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
20820 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
20830 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
20840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
20850 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20860 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
20870 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
20880 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
20890 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
208a0 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
208b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
208c0 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
208d0 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
208e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
208f0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
20900 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
20910 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
20920 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
20930 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20940 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
20950 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20960 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
20970 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
20980 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
20990 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rget);.      }..
209a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
209b0 42 55 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  BUG.      /* The
209c0 20 41 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63   AFFINITY() func
209d0 74 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  tion evaluates t
209e0 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  o a string that 
209f0 64 65 73 63 72 69 62 65 73 0a 20 20 20 20 20 20  describes.      
20a00 2a 2a 20 74 68 65 20 74 79 70 65 20 61 66 66 69  ** the type affi
20a10 6e 69 74 79 20 6f 66 20 74 68 65 20 61 72 67 75  nity of the argu
20a20 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75  ment.  This is u
20a30 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
20a40 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
20a50 53 51 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69  SQLite type logi
20a60 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
20a70 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
20a80 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20a90 55 4e 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a  UNC_AFFINITY ){.
20aa0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
20ab0 61 72 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20  ar *azAff[] = { 
20ac0 22 62 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20  "blob", "text", 
20ad0 22 6e 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65  "numeric", "inte
20ae0 67 65 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a  ger", "real" };.
20af0 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66          char aff
20b00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20b10 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
20b20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
20b30 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
20b40 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
20b50 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
20b60 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
20b70 67 28 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20  g(v, target, .  
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66 20              aff 
20ba0 3f 20 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49  ? azAff[aff-SQLI
20bb0 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22  TE_AFF_BLOB] : "
20bc0 6e 6f 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20  none");.        
20bd0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
20be0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
20bf0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
20c00 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
20c10 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
20c20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20c30 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
20c40 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
20c50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20c60 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
20c70 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
20c80 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
20c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20ca0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
20cb0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20cc0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
20cd0 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
20ce0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
20cf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
20d00 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
20d10 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20d30 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
20d40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20d50 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
20d60 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
20d70 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
20d80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
20d90 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
20da0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20db0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20dc0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
20dd0 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
20de0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20df0 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
20e00 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
20e10 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
20e20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
20e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
20e40 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
20e50 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
20e60 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
20e70 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
20e80 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
20e90 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
20ea0 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
20eb0 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
20ec0 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
20ed0 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
20ee0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
20ef0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20f00 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
20f10 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
20f20 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
20f30 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
20f40 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
20f50 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
20f60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
20f70 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
20f80 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
20f90 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
20fa0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
20fb0 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
20fc0 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
20fd0 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
20fe0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
20ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21000 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
21010 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
21020 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
21030 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21040 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
21050 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
21060 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
21070 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21080 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
21090 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
210a0 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
210b0 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
210c0 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
210f0 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
21100 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
21110 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
21120 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
21130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21140 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
21150 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
21160 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
21190 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
211a0 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d  FACTOR);.      }
211b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
211c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
211d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
211e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
211f0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
21200 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
21210 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
21220 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
21230 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
21240 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
21250 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21260 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
21270 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
21280 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
21290 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
212a0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
212b0 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
212c0 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
212d0 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
212e0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
212f0 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
21300 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
21310 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
21320 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
21330 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
21340 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
21350 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
21360 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
21370 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
21380 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
21390 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
213a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
213b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
213c0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
213d0 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
213e0 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
213f0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
21400 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
21410 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
21420 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
21430 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
21440 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
21450 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
21460 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
21470 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
21480 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21490 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45  f( nFarg>=2 && E
214a0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
214b0 45 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75  Expr, EP_InfixFu
214c0 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
214d0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
214e0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
214f0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
21500 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
21510 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
21520 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
21530 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
21540 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
21550 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
21560 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
21570 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
21580 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
21590 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
215a0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
215b0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
215c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
215d0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
215e0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
215f0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
21600 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
21610 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
21620 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
21630 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
21640 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
21650 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
21660 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20  SET_SQL_FUNC.   
21670 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
21680 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
21690 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20  FUNC_OFFSET ){. 
216a0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72         Expr *pAr
216b0 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  g = pFarg->a[0].
216c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
216d0 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f  f( pArg->op==TK_
216e0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
216f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21700 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
21710 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65  et, pArg->iTable
21720 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pArg->iColumn,
21730 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
21740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21760 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
21770 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
21780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
21790 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
217a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
217b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70  3VdbeAddOp4(v, p
217c0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
217d0 3f 20 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a  ? OP_PureFunc0 :
217e0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20   OP_Function0,. 
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
21810 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20  sk, r1, target, 
21820 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
21830 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
21840 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21850 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
21860 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
21870 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
21880 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
21890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
218a0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
218b0 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
218c0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
218d0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
218e0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
218f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21900 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
21910 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
21920 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
21930 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
21940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21950 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
21960 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
21970 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
21980 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
21990 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c  _SELECT && (nCol
219a0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
219b0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
219c0 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  pr)!=1 ){.      
219d0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
219e0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
219f0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  nCol, 1);.      
21a00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
21a10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64  eturn sqlite3Cod
21a20 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
21a30 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
21a40 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
21a50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
21a60 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a  K_SELECT_COLUMN:
21a70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
21a80 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21a90 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d  >pLeft->iTable==
21aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
21ab0 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c  pr->pLeft->iTabl
21ac0 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  e = sqlite3CodeS
21ad0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
21ae0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
21af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
21b00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
21b10 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
21b20 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
21b30 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
21b40 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21b50 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
21b60 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
21b70 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
21b80 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
21b90 74 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  t)) .      ){.  
21ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21bb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
21bc0 64 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e  d columns assign
21bd0 65 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20  ed %d values",. 
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21c00 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29  Expr->iTable, n)
21c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21c20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c  return pExpr->pL
21c30 65 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45  eft->iTable + pE
21c40 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
21c50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21c60 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
21c70 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
21c80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
21c90 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
21ca0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
21cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21cc0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
21cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21ce0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21cf0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
21d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21d10 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
21d20 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
21d30 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
21d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21d50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21d60 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
21d70 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
21d80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21d90 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
21da0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21db0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21dc0 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
21dd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
21de0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21df0 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
21e00 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
21e10 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21e20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21e30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
21e40 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
21e50 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
21e60 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
21e70 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
21e80 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
21e90 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
21ea0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
21eb0 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
21ec0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
21ed0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
21ee0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21ef0 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
21f00 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
21f10 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21f20 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
21f30 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
21f40 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
21f50 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
21f60 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
21f70 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
21f80 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
21f90 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21fa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
21fb0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
21fc0 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
21fd0 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
21fe0 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
21ff0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
22000 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64  goto expr_code_d
22010 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30  oover; /* 2018-0
22020 34 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65  4-28: Prevent de
22030 65 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53  ep recursion. OS
22040 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a  SFuzz. */.    }.
22050 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
22060 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
22070 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
22080 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
22090 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
220a0 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
220b0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
220c0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
220d0 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
220e0 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
220f0 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
22100 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
22110 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
22120 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
22130 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
22140 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
22150 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
22160 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
22170 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
22180 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
22190 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
221a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
221b0 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
221c0 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
221d0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
221e0 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
221f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22200 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
22210 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
22220 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
22230 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
22240 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
22250 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
22260 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
22270 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
22280 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
22290 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
222a0 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
222b0 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
222c0 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
222d0 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
222e0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
222f0 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
22300 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
22310 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
22320 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
22330 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
22340 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
22350 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
22360 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
22370 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
22380 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
22390 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
223a0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
223b0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
223c0 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
223d0 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
223e0 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
223f0 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
22400 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
22410 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
22420 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
22430 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
22440 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
22450 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
22460 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
22470 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
22480 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22490 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
224a0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
224b0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
224c0 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
224d0 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
224e0 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
224f0 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
22500 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
22510 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
22520 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
22530 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
22540 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
22550 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
22560 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
22570 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
22580 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
22590 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
225a0 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
225b0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
225c0 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
225d0 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
225e0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
225f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
22600 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
22610 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
22620 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
22630 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
22640 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
22650 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
22660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
22670 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
22680 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
22690 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
226a0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
226b0 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
226c0 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
226d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
226e0 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
226f0 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
22700 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
22710 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73 2e 25  ((v, "r[%d]=%s.%
22720 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  s", target,.    
22730 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
22740 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
22750 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
22760 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
22770 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
22780 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ->y.pTab->aCol[p
22790 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
227a0 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29 3b 0a  Name).      ));.
227b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
227c0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
227d0 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
227e0 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
227f0 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
22800 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
22810 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
22820 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
22830 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
22840 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
22850 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
22860 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
22870 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
22880 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
22890 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
228a0 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
228b0 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
228c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
228d0 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
228e0 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
228f0 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
22900 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
22910 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
22920 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
22930 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
22940 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
22950 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
22960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22970 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
22980 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
22990 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
229a0 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
229b0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
229c0 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
229d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
229e0 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
229f0 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
22a00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22a10 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
22a20 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a  _IF_NULL_ROW: {.
22a30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e        int addrIN
22a40 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52  R;.      addrINR
22a50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
22a60 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp1(v, OP_IfNul
22a70 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61  lRow, pExpr->iTa
22a80 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  ble);.      inRe
22a90 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
22aa0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
22ab0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
22ac0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
22ad0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
22ae0 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29 3b 0a  re(v, addrINR);.
22af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22b00 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
22b10 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a 20 20  rINR, inReg);.  
22b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22b30 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22b40 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
22b50 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
22b60 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
22b70 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
22b80 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
22b90 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
22ba0 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
22bb0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
22bc0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
22bd0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
22be0 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
22bf0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
22c00 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
22c10 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
22c20 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
22c30 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
22c40 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
22c50 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
22c60 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
22c70 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
22c80 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
22c90 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
22ca0 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
22cb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
22cc0 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
22cd0 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
22ce0 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
22cf0 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
22d00 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
22d10 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
22d20 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
22d30 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
22d40 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
22d50 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
22d60 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
22d70 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
22d80 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
22d90 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
22da0 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
22db0 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
22dc0 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
22dd0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
22de0 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
22df0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
22e00 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
22e10 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
22e20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
22e30 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
22e40 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
22e50 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
22e60 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
22e70 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
22e80 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
22e90 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
22ea0 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
22eb0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
22ec0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
22ed0 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
22ee0 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
22ef0 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
22f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
22f10 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
22f20 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
22f30 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
22f40 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
22f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
22f60 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
22f70 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
22f80 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
22fb0 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
22fc0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
22fd0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ff0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
23000 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
23010 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
23020 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
23030 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
23040 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
23050 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
23060 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
23070 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
23080 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
23090 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
230a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
230b0 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
230c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
230d0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
230f0 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
23100 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
23110 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23130 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
23140 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
23150 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73   B) */..      as
23160 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23170 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23180 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
23190 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
231a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
231b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
231c0 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
231d0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
231e0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
231f0 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
23200 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
23210 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
23220 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
23230 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
23240 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
23250 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
23260 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
23270 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  =0 ){.        ex
23280 70 72 4e 6f 64 65 43 6f 70 79 28 26 74 65 6d 70  prNodeCopy(&temp
23290 58 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 20 20  X, pX);.        
232a0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
232b0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
232c0 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
232d0 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 65 78  ister(&tempX, ex
232e0 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
232f0 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
23300 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
23310 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
23320 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
23330 20 20 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d     memset(&opCom
23340 70 61 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pare, 0, sizeof(
23350 6f 70 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20  opCompare));.   
23360 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
23370 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
23380 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
23390 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
233a0 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
233b0 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
233c0 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
233d0 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
233e0 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
233f0 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
23400 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
23410 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
23420 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
23430 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
23440 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
23450 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
23460 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
23470 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
23480 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
23490 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
234a0 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
234b0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
234c0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
234d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
234e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
234f0 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
23500 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
23510 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23520 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
23530 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
23540 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
23550 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
23560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23570 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
23580 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
23590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
235a0 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
235b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
235c0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
235d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
235e0 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
235f0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
23600 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23610 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
23620 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
23630 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
23640 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23650 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
23660 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
23670 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
23680 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
23690 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
236a0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
236b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
236c0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
236d0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
236e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
236f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23700 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
23710 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
23720 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
23730 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23740 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
23750 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
23760 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
23770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23780 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
237a0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
237b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
237c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
237d0 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
237e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
237f0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23800 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
23810 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
23820 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
23830 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
23840 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
23850 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
23860 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
23870 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
23880 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
23890 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
238a0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
238b0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
238c0 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
238d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
238e0 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
238f0 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23900 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23910 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
23930 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
23940 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
23950 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
23960 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
23970 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
23980 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
23990 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
239a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
239b0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
239c0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
239d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
239e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
239f0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23a00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
23a10 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23a20 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
23a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23a40 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
23a50 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
23a60 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
23a70 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
23a80 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
23a90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
23aa0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
23ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23ac0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
23ad0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
23ae0 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
23af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
23b20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23b30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
23b40 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
23b50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23b60 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
23b70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
23b80 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
23b90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23ba0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23bb0 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
23bc0 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
23bd0 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
23be0 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
23bf0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
23c00 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
23c10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 44  e..**.** If regD
23c20 65 73 74 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  est>=0 then the 
23c30 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
23c40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 61 74 20   stored in that 
23c50 72 65 67 69 73 74 65 72 20 61 6e 64 20 74 68 65  register and the
23c60 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  .** result is no
23c70 74 20 72 65 75 73 61 62 6c 65 2e 20 20 49 66 20  t reusable.  If 
23c80 72 65 67 44 65 73 74 3c 30 20 74 68 65 6e 20 74  regDest<0 then t
23c90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 66  his routine is f
23ca0 72 65 65 20 74 6f 20 0a 2a 2a 20 73 74 6f 72 65  ree to .** store
23cb0 20 74 68 65 20 76 61 6c 75 65 20 77 68 65 72 65   the value where
23cc0 65 76 65 72 20 69 74 20 77 61 6e 74 73 2e 20 20  ever it wants.  
23cd0 54 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  The register whe
23ce0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
23cf0 6e 20 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  n .** is stored 
23d00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 57 68  is returned.  Wh
23d10 65 6e 20 72 65 67 44 65 73 74 3c 30 2c 20 74 77  en regDest<0, tw
23d20 6f 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70 72  o identical expr
23d30 65 73 73 69 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20  essions will.** 
23d40 63 6f 64 65 20 74 6f 20 74 68 65 20 73 61 6d 65  code to the same
23d50 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
23d60 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
23d70 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
23d80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23d90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23da0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
23db0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
23dc0 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
23dd0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
23de0 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
23df0 69 6e 74 20 72 65 67 44 65 73 74 20 20 20 20 20  int regDest     
23e00 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
23e10 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
23e20 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
23e30 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
23e40 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
23e50 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
23e60 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
23e70 73 74 45 78 70 72 3b 0a 20 20 69 66 28 20 72 65  stExpr;.  if( re
23e80 67 44 65 73 74 3c 30 20 26 26 20 70 20 29 7b 0a  gDest<0 && p ){.
23e90 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23ea0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23eb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23ec0 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
23ed0 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
23ee0 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
23ef0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
23f00 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
23f10 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
23f20 30 2c 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  0,pItem->pExpr,p
23f30 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
23f40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
23f50 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
23f60 72 52 65 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rReg;.      }.  
23f70 20 20 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 20    }.  }.  pExpr 
23f80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
23f90 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
23fa0 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
23fb0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
23fc0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
23fd0 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
23fe0 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
23ff0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
24000 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
24010 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
24020 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
24030 65 67 44 65 73 74 3c 30 3b 0a 20 20 20 20 20 69  egDest<0;.     i
24040 66 28 20 72 65 67 44 65 73 74 3c 30 20 29 20 72  f( regDest<0 ) r
24050 65 67 44 65 73 74 20 3d 20 2b 2b 70 50 61 72 73  egDest = ++pPars
24060 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 70 49  e->nMem;.     pI
24070 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
24080 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
24090 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
240a0 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 20 20  onstExpr = p;.  
240b0 72 65 74 75 72 6e 20 72 65 67 44 65 73 74 3b 0a  return regDest;.
240c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
240d0 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
240e0 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
240f0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
24100 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
24110 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
24120 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
24130 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
24140 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
24150 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
24160 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
24170 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
24180 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
24190 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
241a0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
241b0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
241c0 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
241d0 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
241e0 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
241f0 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
24200 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
24210 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
24220 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
24230 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
24240 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
24250 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
24260 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
24270 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
24280 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
24290 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
242a0 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
242b0 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
242c0 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
242d0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
242e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
242f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
24300 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
24310 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
24320 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
24330 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
24340 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
24350 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
24360 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
24370 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
24380 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
24390 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
243a0 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
243b0 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  {.    *pReg  = 0
243c0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
243d0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
243e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
243f0 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
24400 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
24410 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
24420 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
24430 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24440 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
24450 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
24460 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
24470 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
24480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24490 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
244a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
244b0 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
244c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
244d0 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
244e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
244f0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
24500 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
24510 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
24520 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
24530 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
24540 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
24550 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
24560 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
24570 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
24580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24590 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
245a0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
245b0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
245c0 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
245d0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
245e0 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
245f0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
24600 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
24610 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
24620 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
24630 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
24640 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
24650 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
24660 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
24670 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
24680 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
24690 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
246a0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
246b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
246c0 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
246d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
246e0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
246f0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
24700 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
24710 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24720 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
24730 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
24740 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
24750 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
24760 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
24770 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
24780 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
24790 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
247a0 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
247b0 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
247c0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
247d0 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
247e0 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
247f0 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
24800 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
24810 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
24820 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
24830 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24840 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
24850 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24860 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24870 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
24880 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24890 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
248a0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
248b0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
248c0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
248d0 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
248e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
248f0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
24900 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
24910 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
24920 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24930 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
24940 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
24950 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
24960 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
24970 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24980 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
24990 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
249a0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
249b0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
249c0 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
249d0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
249e0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
249f0 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
24a00 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
24a10 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
24a20 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
24a30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24a40 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
24a50 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
24a60 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
24a70 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
24a80 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
24a90 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
24aa0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
24ab0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20  tNotJoin(pExpr) 
24ac0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24ad0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24ae0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
24af0 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
24b00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
24b10 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
24b20 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
24b30 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24b40 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
24b50 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
24b60 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
24b70 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
24b80 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
24b90 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
24ba0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
24bb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
24bc0 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
24bd0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
24be0 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
24bf0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24c00 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
24c10 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
24c20 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
24c30 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
24c40 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
24c50 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
24c60 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
24c70 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
24c80 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
24c90 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
24ca0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
24cb0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
24cc0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
24cd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
24ce0 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
24cf0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24d00 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
24d10 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
24d20 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
24d30 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
24d40 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
24d50 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
24d60 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
24d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
24d80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
24d90 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
24da0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
24db0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
24dc0 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
24dd0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
24de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24df0 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
24e00 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
24e10 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
24e20 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iMem);.}../*.*
24e30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
24e40 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
24e50 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
24e60 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
24e70 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
24e80 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
24e90 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
24ea0 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
24eb0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
24ec0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
24ed0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
24ee0 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
24ef0 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
24f00 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
24f10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
24f20 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
24f30 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
24f40 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
24f50 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
24f60 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
24f70 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
24f80 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
24f90 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
24fa0 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
24fb0 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
24fc0 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
24fd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
24fe0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
24ff0 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
25000 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
25010 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
25020 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
25030 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
25040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
25050 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
25060 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
25070 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
25080 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
25090 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
250a0 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
250b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
250c0 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
250d0 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
250e0 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
250f0 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
25100 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
25110 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
25120 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
25130 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
25140 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
25150 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
25160 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
25170 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
25180 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
25190 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
251a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
251b0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
251c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
251d0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
251e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
251f0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
25200 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
25210 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
25220 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
25230 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
25240 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
25250 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
25260 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
25270 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
25280 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
25290 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
252a0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
252b0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
252c0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
252d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
252e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
252f0 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
25300 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
25310 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
25320 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
25330 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
25340 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
25350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
25360 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
25370 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
25380 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
25390 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
253a0 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
253b0 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
253c0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
253d0 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
253e0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
253f0 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
25400 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
25410 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
25420 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
25430 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
25440 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
25450 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
25460 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25470 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
25480 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
25490 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
254a0 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
254b0 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
254c0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
254d0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
254e0 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
254f0 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
25500 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
25510 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
25520 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25530 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
25540 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
25550 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
25560 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
25570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25580 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
25590 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
255a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
255b0 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
255c0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
255d0 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
255e0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
255f0 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
25600 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
25610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25620 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
25630 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
25640 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
25650 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
25660 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
25670 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
25680 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
25690 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
256a0 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
256b0 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
256c0 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
256d0 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
256e0 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
256f0 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
25700 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
25710 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
25720 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
25730 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
25740 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
25750 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
25760 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
25770 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
25780 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
25790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
257a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
257b0 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
257c0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
257d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
257e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
257f0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
25800 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25810 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
25820 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
25830 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
25840 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
25850 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
25860 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
25870 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
25880 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
25890 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
258a0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
258b0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
258c0 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
258d0 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
258e0 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
258f0 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
25900 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
25910 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
25920 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
25930 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
25940 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
25950 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
25960 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
25970 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
25980 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
25990 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
259a0 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
259b0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
259c0 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
259d0 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
259e0 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
259f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
25a00 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
25a10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25a20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
25a30 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
25a40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
25a50 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
25a60 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
25a70 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
25a80 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
25a90 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
25aa0 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
25ab0 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
25ac0 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
25ad0 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
25ae0 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
25af0 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
25b00 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
25b10 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
25b20 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
25b30 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70   NULL */.){. Exp
25b40 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
25b50 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
25b60 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
25b70 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
25b80 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
25b90 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
25ba0 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
25bb0 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
25bc0 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
25bd0 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
25be0 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
25bf0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
25c00 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
25c10 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
25c20 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
25c30 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66   memset(&compLef
25c40 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  t, 0, sizeof(Exp
25c50 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63  r));.  memset(&c
25c60 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a  ompRight, 0, siz
25c70 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65  eof(Expr));.  me
25c80 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30  mset(&exprAnd, 0
25c90 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
25ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
25cb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
25cc0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
25cd0 29 20 29 3b 0a 20 20 65 78 70 72 4e 6f 64 65 43  ) );.  exprNodeC
25ce0 6f 70 79 28 26 65 78 70 72 58 2c 20 70 45 78 70  opy(&exprX, pExp
25cf0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 65 78 70  r->pLeft);.  exp
25d00 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
25d10 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
25d20 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
25d30 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
25d40 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
25d50 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
25d60 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
25d70 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
25d80 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
25d90 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
25da0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
25db0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
25dc0 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
25dd0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
25de0 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
25df0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
25e00 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
25e10 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
25e20 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65 78  ister(&exprX, ex
25e30 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
25e40 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
25e50 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
25e60 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a 75  xJump ){.    xJu
25e70 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
25e80 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
25e90 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
25ea0 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  .    /* Mark the
25eb0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 62   expression is b
25ec0 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 4e  eing from the ON
25ed0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
25ee0 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20 2a   of a join.    *
25ef0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 71  * so that the sq
25f00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
25f10 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77 69  get() routine wi
25f20 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
25f30 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69 74  o move.    ** it
25f40 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e   into the Parse.
25f50 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 2e  pConstExpr list.
25f60 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65 20    We should use 
25f70 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74 68  a new bit for th
25f80 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 63  is,.    ** for c
25f90 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20 61  larity, but we a
25fa0 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69  re out of bits i
25fb0 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73  n the Expr.flags
25fc0 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20   field so we.   
25fd0 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
25fe0 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
25ff0 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
26000 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c 61  */.    exprX.fla
26010 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
26020 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
26030 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
26040 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
26050 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  est);.  }.  sqli
26060 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
26070 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
26080 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
26090 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
260a0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
260b0 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
260c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
260d0 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d    && jumpIfNull=
260e0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
260f0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
26100 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45   xJump==sqlite3E
26110 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a 75  xprIfTrue  && ju
26120 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
26130 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
26140 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d  testcase( xJump=
26150 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72  =sqlite3ExprIfTr
26160 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ue  && jumpIfNul
26170 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
26180 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
26190 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
261a0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
261b0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
261c0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
261d0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
261e0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
261f0 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66 4e  False && jumpIfN
26200 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
26210 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
26220 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
26230 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20 26  te3ExprIfFalse &
26240 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
26250 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
26260 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
26270 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
26280 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49  IfFalse && jumpI
26290 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
262a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
262b0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
262c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
262d0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
262e0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
262f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
26300 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xJump==0 );.}../
26310 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
26320 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
26330 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
26340 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
26350 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
26360 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
26370 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
26380 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
26390 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
263a0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
263b0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
263c0 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
263d0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
263e0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
263f0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
26400 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
26410 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
26420 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
26430 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
26440 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
26450 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
26460 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
26470 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
26480 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
26490 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
264a0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
264b0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
264c0 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
264d0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
264e0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
264f0 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
26500 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
26510 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
26520 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
26530 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
26540 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
26550 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
26560 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
26570 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
26580 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
26590 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
265a0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
265b0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
265c0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
265d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
265e0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
265f0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
26600 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
26610 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26620 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
26630 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
26640 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
26650 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
26660 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
26670 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
26680 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
26690 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
266a0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
266b0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
266c0 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
266d0 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
266e0 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
266f0 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
26700 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
26710 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
26720 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
26730 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
26740 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
26750 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
26760 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
26770 20 20 20 20 20 45 78 70 72 20 2a 70 41 6c 74 20       Expr *pAlt 
26780 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 69 6d  = sqlite3ExprSim
26790 70 6c 69 66 69 65 64 41 6e 64 4f 72 28 70 45 78  plifiedAndOr(pEx
267a0 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
267b0 41 6c 74 21 3d 70 45 78 70 72 20 29 7b 0a 20 20  Alt!=pExpr ){.  
267c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
267d0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
267e0 70 41 6c 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  pAlt, dest, jump
267f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
26800 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
26810 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  AND ){.        i
26820 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
26830 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
26840 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rse);.        te
26850 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26860 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ll==0 );.       
26870 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26880 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26890 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 0a 20 20  r->pLeft, d2,.  
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 66 4e           jumpIfN
268c0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
268d0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
268e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
268f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26900 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
26910 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
26930 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
26940 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
26950 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
26960 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
26970 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
26980 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
26990 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
269a0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
269b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
269c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
269d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
269e0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
269f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26a00 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
26a10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26a20 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
26a30 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26a40 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26a50 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
26a60 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
26a70 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
26a80 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
26a90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26aa0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48     case TK_TRUTH
26ab0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  : {.      int is
26ac0 4e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 49 53 20  Not;      /* IS 
26ad0 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
26ae0 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
26af0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 20    int isTrue;   
26b00 20 20 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20    /* IS TRUE or 
26b10 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
26b20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26b30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26b40 20 20 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45        isNot = pE
26b50 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e  xpr->op2==TK_ISN
26b60 4f 54 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65  OT;.      isTrue
26b70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72   = sqlite3ExprTr
26b80 75 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e  uthValue(pExpr->
26b90 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74  pRight);.      t
26ba0 65 73 74 63 61 73 65 28 20 69 73 54 72 75 65 20  estcase( isTrue 
26bb0 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20  && isNot );.    
26bc0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 54    testcase( !isT
26bd0 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a  rue && isNot );.
26be0 20 20 20 20 20 20 69 66 28 20 69 73 54 72 75 65        if( isTrue
26bf0 20 5e 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20   ^ isNot ){.    
26c00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26c10 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
26c20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
26c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26c40 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f              isNo
26c50 74 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  t ? SQLITE_JUMPI
26c60 46 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20  FNULL : 0);.    
26c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26c80 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26c90 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
26ca0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a  r->pLeft, dest,.
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74             isNot
26cd0 20 3f 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   ? SQLITE_JUMPIF
26ce0 4e 55 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20  NULL : 0);.     
26cf0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
26d00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
26d10 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
26d20 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
26d30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
26d40 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
26d50 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
26d60 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  OT );.      op =
26d70 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
26d80 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
26d90 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d      jumpIfNull =
26da0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a   SQLITE_NULLEQ;.
26db0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
26dc0 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
26dd0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
26de0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
26df0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
26e00 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
26e10 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
26e20 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
26e30 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
26e40 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65  ector(pExpr->pLe
26e50 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75  ft) ) goto defau
26e60 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74  lt_expr;.      t
26e70 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
26e80 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
26e90 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
26ea0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
26eb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
26ec0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
26ed0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
26ee0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
26ef0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26f00 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
26f10 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
26f20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
26f30 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
26f40 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
26f50 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
26f60 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
26f70 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
26f80 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
26f90 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26fa0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
26fb0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
26fc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26fd0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
26fe0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
26ff0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
27000 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
27010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
27020 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
27030 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
27040 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
27050 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
27060 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
27070 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
27080 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
27090 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
270a0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
270b0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
270c0 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
270d0 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
270e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
270f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
27100 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
27110 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
27120 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27130 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
27140 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
27150 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
27160 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
27170 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
27180 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
27190 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
271a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
271b0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
271c0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
271d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
271e0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
271f0 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
27200 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
27210 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
27220 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
27230 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
27240 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
27250 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27260 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27270 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
27280 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
27290 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
272a0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
272b0 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
272c0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
272d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
272e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
272f0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
27300 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
27310 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
27320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27330 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
27340 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
27350 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
27360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27370 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
27380 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
27390 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
273a0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
273b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
273c0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
273d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
273e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
273f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27400 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27410 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
27420 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
27430 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
27440 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
27450 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
27460 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
27470 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
27480 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
27490 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
274a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
274b0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
274c0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
274d0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
274e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
274f0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
27500 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
27510 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
27520 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
27530 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
27540 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
27550 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
27560 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
27570 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
27580 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
27590 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
275a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
275b0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
275c0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
275d0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
275e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
275f0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
27600 3a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  :.      if( Expr
27610 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
27620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
27630 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
27640 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
27650 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
27660 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
27670 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
27680 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
27690 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
276a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
276b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
276c0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
276d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
276e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
276f0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
27700 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
27710 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
27720 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
27730 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
27740 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
27750 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
27760 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
27770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27780 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
27790 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
277a0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
277b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
277c0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
277d0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
277e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
277f0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
27800 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
27810 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
27820 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
27830 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
27840 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
27850 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
27860 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
27870 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
27880 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
27890 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
278a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
278b0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
278c0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
278d0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
278e0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
278f0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
27900 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
27910 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
27920 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
27930 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
27940 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
27950 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
27960 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
27970 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
27980 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
27990 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
279a0 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
279b0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
279c0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
279d0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
279e0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
279f0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
27a00 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
27a10 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
27a20 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
27a30 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
27a40 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
27a50 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
27a60 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
27a70 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
27a80 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
27a90 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
27aa0 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
27ab0 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
27ac0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
27ad0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
27ae0 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
27af0 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
27b00 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
27b10 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
27b20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
27b30 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
27b40 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
27b50 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
27b60 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
27b70 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
27b80 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
27b90 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
27ba0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
27bb0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
27bd0 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
27be0 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
27bf0 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
27c00 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
27c10 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
27c20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
27c30 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
27c40 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
27c50 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
27c60 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
27c70 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
27c80 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
27c90 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
27ca0 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
27cb0 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
27cc0 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
27cd0 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
27ce0 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
27cf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
27d00 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
27d10 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
27d20 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
27d30 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
27d40 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
27d50 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
27d60 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
27d70 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
27d80 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
27d90 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
27da0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
27db0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27dc0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
27dd0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
27de0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
27df0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27e00 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
27e10 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
27e20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
27e30 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
27e40 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
27e50 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
27e60 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
27e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27e80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
27e90 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
27ea0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27eb0 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
27ec0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
27ed0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27ee0 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
27ef0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27f00 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
27f10 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
27f20 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
27f30 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
27f40 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
27f50 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
27f60 20 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71   Expr *pAlt = sq
27f70 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
27f80 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b  iedAndOr(pExpr);
27f90 0a 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21  .      if( pAlt!
27fa0 3d 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  =pExpr ){.      
27fb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27fc0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c  alse(pParse, pAl
27fd0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27fe0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
27ff0 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
28000 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
28010 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28020 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28030 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28040 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28050 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28060 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
28070 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28080 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
28090 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
280a0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
280b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Null);.      }el
280c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
280d0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
280e0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
280f0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28100 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28110 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
28120 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
28130 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28140 4c 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20  Left, d2,.      
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53      jumpIfNull^S
28170 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28180 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28190 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
281a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
281b0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
281c0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
281d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
281e0 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
281f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
28200 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28210 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
28220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28230 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28240 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28250 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28260 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
28270 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28290 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
282a0 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
282b0 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
282c0 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
282d0 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
282e0 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
282f0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
28300 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
28310 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28320 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28330 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
28340 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
28350 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d  ;.      isTrue =
28360 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74   sqlite3ExprTrut
28370 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52  hValue(pExpr->pR
28380 69 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73  ight);.      tes
28390 74 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26  tcase( isTrue &&
283a0 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20   isNot );.      
283b0 74 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75  testcase( !isTru
283c0 65 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20  e && isNot );.  
283d0 20 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e      if( isTrue ^
283e0 20 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20   isNot ){.      
283f0 20 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64    /* IS TRUE and
28400 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f   IS NOT FALSE */
28410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28420 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
28430 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
28440 2c 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20  , dest,.        
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28460 20 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53     isNot ? 0 : S
28470 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28480 29 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  );..      }else{
28490 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46  .        /* IS F
284a0 41 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20  ALSE and IS NOT 
284b0 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  TRUE */.        
284c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
284d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
284e0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20  >pLeft, dest,.  
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
28510 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  0 : SQLITE_JUMPI
28520 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
28530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28540 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28550 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
28560 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
28570 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
28580 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
28590 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
285a0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
285b0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
285c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
285d0 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
285e0 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c        jumpIfNull
285f0 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51   = SQLITE_NULLEQ
28600 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
28610 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
28620 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
28630 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
28640 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
28650 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
28660 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
28670 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
28680 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
28690 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70  sVector(pExpr->p
286a0 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66  Left) ) goto def
286b0 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20  ault_expr;.     
286c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
286d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
286e0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
286f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
28700 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
28710 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28720 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
28730 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
28740 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
28750 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
28760 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
28770 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28780 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
28790 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
287a0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
287b0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
287c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
287d0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
287e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
287f0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
28800 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28810 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
28820 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
28830 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28840 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
28850 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
28860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28870 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
28880 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
28890 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
288a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
288b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
288c0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
288d0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
288e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
288f0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
28900 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
28910 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
28920 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
28930 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28940 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28950 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
28960 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
28970 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
28980 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28990 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
289a0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
289b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
289c0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
289d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
289e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
289f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28a00 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28a10 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
28a20 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
28a30 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28a40 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
28a50 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
28a60 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
28a70 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
28a80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
28a90 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
28aa0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28ab0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28ac0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
28ad0 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
28ae0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
28af0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28b00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28b10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
28b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28b30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
28b40 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
28b50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
28b60 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
28b70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
28b80 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
28b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28ba0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
28bb0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
28bc0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28bd0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28be0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28bf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28c00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28c10 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
28c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28c30 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28c40 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
28c50 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
28c60 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28c70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
28c80 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28c90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28ca0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28cb0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
28cc0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
28cd0 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
28ce0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
28cf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
28d00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28d10 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
28d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28d30 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
28d40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28d50 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
28d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28d70 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
28d80 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
28d90 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
28da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28db0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
28dc0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
28dd0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
28de0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
28df0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
28e00 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a 20    default_expr: 
28e10 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
28e20 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
28e30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
28e40 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
28e50 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
28e60 73 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79  se if( ExprAlway
28e70 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
28e80 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
28e90 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
28ea0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
28eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
28ec0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
28ed0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28ee0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28ef0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
28f00 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
28f10 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
28f20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28f30 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
28f40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
28f50 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
28f60 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28f70 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28f80 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
28f90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
28fa0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
28fb0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
28fc0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
28fd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28fe0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
28ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
29000 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
29010 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
29020 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
29030 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
29040 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
29050 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
29060 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
29070 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
29080 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
29090 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
290a0 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
290b0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
290c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
290d0 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
290e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
290f0 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
29100 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
29110 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29120 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
29130 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
29140 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
29150 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
29160 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
29170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
29180 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
29190 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
291a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
291b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
291c0 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
291d0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  }../*.** Express
291e0 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75 61 72  ion pVar is guar
291f0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
29200 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 70 45  SQL variable. pE
29210 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79 0a 2a  xpr may be any.*
29220 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72 65 73  * type of expres
29230 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  sion..**.** If p
29240 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
29250 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61 6e 20   SQL value - an 
29260 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73  integer, real, s
29270 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a 20 6f  tring, blob.** o
29280 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d 20 74  r NULL value - t
29290 68 65 6e 20 74 68 65 20 56 44 42 45 20 63 75 72  hen the VDBE cur
292a0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 72 65  rently being pre
292b0 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69 67 75  pared is configu
292c0 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70 72 65  red.** to re-pre
292d0 70 61 72 65 20 65 61 63 68 20 74 69 6d 65 20 61  pare each time a
292e0 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 62 6f   new value is bo
292f0 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c 65 20  und to variable 
29300 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  pVar..**.** Addi
29310 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 45 78  tionally, if pEx
29320 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65 20 53  pr is a simple S
29330 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  QL value and the
29340 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a 2a 2a   value is the.**
29350 20 73 61 6d 65 20 61 73 20 74 68 61 74 20 63 75   same as that cu
29360 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f  rrently bound to
29370 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2c 20   variable pVar, 
29380 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
29390 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
293a0 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  se, if the value
293b0 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  s are not the sa
293c0 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72 20 69  me or if pExpr i
293d0 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 0a 2a  s not a simple.*
293e0 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a 65 72  * SQL value, zer
293f0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
29400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
29410 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
29420 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29430 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78 70 72  Expr *pVar, Expr
29440 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
29450 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  res = 0;.  int i
29460 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Var;.  sqlite3_v
29470 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20 3d 20  alue *pL, *pR = 
29480 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 56  0;.  .  sqlite3V
29490 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
294a0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
294b0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
294c0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20 26 70  ITE_AFF_BLOB, &p
294d0 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29 7b 0a  R);.  if( pR ){.
294e0 20 20 20 20 69 56 61 72 20 3d 20 70 56 61 72 2d      iVar = pVar-
294f0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  >iColumn;.    sq
29500 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
29510 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ask(pParse->pVdb
29520 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20 70 4c  e, iVar);.    pL
29530 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
29540 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50 61 72  tBoundValue(pPar
29550 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65 2c 20  se->pReprepare, 
29560 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41 46 46  iVar, SQLITE_AFF
29570 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66 28 20  _BLOB);.    if( 
29580 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  pL ){.      if( 
29590 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
295a0 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45 5f 54  pe(pL)==SQLITE_T
295b0 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EXT ){.        s
295c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
295d0 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65 20 73  t(pL); /* Make s
295e0 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ure the encoding
295f0 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20 20 20   is UTF-8 */.   
29600 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
29610 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 43    0==sqlite3MemC
29620 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c 20 30  ompare(pL, pR, 0
29630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29640 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
29650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
29660 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20 20 7d  lueFree(pL);.  }
29670 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
29680 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
29690 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
296a0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
296b0 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
296c0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
296d0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
296e0 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
296f0 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
29700 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
29710 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
29720 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
29730 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
29740 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
29750 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
29760 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
29770 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
29780 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
29790 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
297a0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
297b0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
297c0 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
297d0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
297e0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
297f0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
29800 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
29810 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
29820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
29830 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
29840 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
29850 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
29860 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
29870 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
29880 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
29890 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
298a0 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
298b0 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
298c0 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
298d0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
298e0 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
298f0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
29900 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
29910 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
29920 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
29930 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
29940 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
29950 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
29960 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
29970 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
29980 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
29990 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
299a0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
299b0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
299c0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
299d0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
299e0 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
299f0 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
29a00 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
29a10 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
29a20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
29a30 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
29a40 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
29a50 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
29a60 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
29a70 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
29a80 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
29a90 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
29aa0 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
29ab0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
29ac0 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
29ad0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
29ae0 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
29af0 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
29b00 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
29b10 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20  f pParse is not 
29b20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56 41 52  NULL then TK_VAR
29b30 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e 20 70  IABLE terms in p
29b40 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67 73 20  A with bindings 
29b50 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 52  in.** pParse->pR
29b60 65 70 72 65 70 61 72 65 20 63 61 6e 20 62 65 20  eprepare can be 
29b70 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
29b80 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42 2e 20  literals in pB. 
29b90 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73 65 2d   The .** pParse-
29ba0 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73 6b 20  >pVdbe->expmask 
29bb0 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64 61 74  bitmask is updat
29bc0 65 64 20 66 6f 72 20 65 61 63 68 20 76 61 72 69  ed for each vari
29bd0 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 64 2e  able referenced.
29be0 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20 69 73  .** If pParse is
29bf0 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72 6d 61   NULL (the norma
29c00 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61 6e 79  l case) then any
29c10 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74 65 72   TK_VARIABLE ter
29c20 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d 65 6e  m in .** Argumen
29c30 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c 64 20  t pParse should 
29c40 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55 4c 4c  normally be NULL
29c50 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  . If it is not N
29c60 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a 2a 2a  ULL and pA or.**
29c70 20 70 42 20 63 61 75 73 65 73 20 61 20 72 65 74   pB causes a ret
29c80 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32 2e 0a  urn value of 2..
29c90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
29ca0 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20  prCompare(Parse 
29cb0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
29cc0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
29cd0 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
29ce0 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
29cf0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
29d00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29d10 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
29d20 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
29d30 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56   && pA->op==TK_V
29d40 41 52 49 41 42 4c 45 20 26 26 20 65 78 70 72 43  ARIABLE && exprC
29d50 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65 28 70  ompareVariable(p
29d60 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29 20 29  Parse, pA, pB) )
29d70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
29d80 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
29d90 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
29da0 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
29db0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
29dc0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
29dd0 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
29de0 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
29df0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
29e00 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
29e10 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
29e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
29e30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
29e40 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
29e50 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c 7c 20  ->op!=pB->op || 
29e60 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49 53 45  pA->op==TK_RAISE
29e70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
29e80 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
29e90 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
29ea0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
29eb0 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62 29 3c  >pLeft,pB,iTab)<
29ec0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
29ed0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
29ee0 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
29ef0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29f00 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29f10 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65 66 74  se, pA,pB->pLeft
29f20 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
29f30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29f40 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
29f50 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
29f60 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
29f70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
29f80 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54  LUMN && pA->u.zT
29f90 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
29fa0 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  pA->op==TK_FUNCT
29fb0 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ION ){.      if(
29fc0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
29fd0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
29fe0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20  >u.zToken)!=0 ) 
29ff0 72 65 74 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65  return 2;.#ifnde
2a000 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
2a010 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 2f  NDOWFUNC.      /
2a020 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
2a030 66 6f 72 20 74 68 65 20 61 73 73 65 72 74 28 29  for the assert()
2a040 3a 0a 20 20 20 20 20 20 2a 2a 20 77 69 6e 64 6f  :.      ** windo
2a050 77 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  w functions have
2a060 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
2a070 49 4f 4e 20 62 75 74 20 61 67 67 72 65 67 61 74  ION but aggregat
2a080 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  e functions.    
2a090 20 20 2a 2a 20 68 61 76 65 20 70 2d 3e 6f 70 3d    ** have p->op=
2a0a0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2a0b0 2e 20 20 53 6f 20 61 6e 79 20 63 6f 6d 70 61 72  .  So any compar
2a0c0 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 6e 20  ison between an 
2a0d0 61 67 67 72 65 67 61 74 65 0a 20 20 20 20 20 20  aggregate.      
2a0e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  ** function and 
2a0f0 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
2a100 6e 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 61  n should have fa
2a110 69 6c 65 64 20 62 65 66 6f 72 65 20 72 65 61 63  iled before reac
2a120 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
2a130 69 73 20 70 6f 69 6e 74 2e 20 20 41 6e 64 2c 20  is point.  And, 
2a140 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
2a150 6c 65 20 74 6f 20 68 61 76 65 20 61 20 77 69 6e  le to have a win
2a160 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  dow function and
2a170 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 63 61 6c  .      ** a scal
2a180 61 72 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ar function with
2a190 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
2a1a0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  nd number of arg
2a1b0 75 6d 65 6e 74 73 2e 20 20 53 6f 0a 20 20 20 20  uments.  So.    
2a1c0 20 20 2a 2a 20 69 66 20 77 65 20 72 65 61 63 68    ** if we reach
2a1d0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 69 74   this point, eit
2a1e0 68 65 72 20 41 20 61 6e 64 20 42 20 62 6f 74 68  her A and B both
2a1f0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2a200 73 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 6e 65  s or.      ** ne
2a210 69 74 68 65 72 20 61 72 65 20 61 20 77 69 6e 64  ither are a wind
2a220 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f  ow functions. */
2a230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
2a240 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a250 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 3d 3d 45  A,EP_WinFunc)==E
2a260 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a270 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 3b  B,EP_WinFunc) );
2a280 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
2a290 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 45 50  asProperty(pA,EP
2a2a0 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
2a2b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2a2c0 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 70 50  WindowCompare(pP
2a2d0 61 72 73 65 2c 70 41 2d 3e 79 2e 70 57 69 6e 2c  arse,pA->y.pWin,
2a2e0 70 42 2d 3e 79 2e 70 57 69 6e 29 21 3d 30 20 29  pB->y.pWin)!=0 )
2a2f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
2a300 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
2a310 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d  lse if( pA->op==
2a320 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  TK_NULL ){.     
2a330 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2a340 65 6c 73 65 20 69 66 28 20 70 41 2d 3e 6f 70 3d  else if( pA->op=
2a350 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
2a360 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2a370 5f 73 74 72 69 63 6d 70 28 70 41 2d 3e 75 2e 7a  _stricmp(pA->u.z
2a380 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
2a390 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
2a3a0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
2a3b0 20 41 4c 57 41 59 53 28 70 42 2d 3e 75 2e 7a 54   ALWAYS(pB->u.zT
2a3c0 6f 6b 65 6e 21 3d 30 29 20 26 26 20 73 74 72 63  oken!=0) && strc
2a3d0 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
2a3e0 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
2a3f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2a400 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
2a410 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
2a420 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
2a430 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
2a440 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
2a450 6e 20 32 3b 0a 20 20 69 66 28 20 28 63 6f 6d 62  n 2;.  if( (comb
2a460 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
2a470 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29 7b 0a  okenOnly)==0 ){.
2a480 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64      if( combined
2a490 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  Flags & EP_xIsSe
2a4a0 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b  lect ) return 2;
2a4b0 0a 20 20 20 20 69 66 28 20 28 63 6f 6d 62 69 6e  .    if( (combin
2a4c0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 46 69 78  edFlags & EP_Fix
2a4d0 65 64 43 6f 6c 29 3d 3d 30 0a 20 20 20 20 20 26  edCol)==0.     &
2a4e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
2a4f0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 41 2d  pare(pParse, pA-
2a500 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
2a510 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2a520 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
2a530 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2a540 70 50 61 72 73 65 2c 20 70 41 2d 3e 70 52 69 67  pParse, pA->pRig
2a550 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20  ht, pB->pRight, 
2a560 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
2a570 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2a580 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2a590 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42  (pA->x.pList, pB
2a5a0 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29  ->x.pList, iTab)
2a5b0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2a5c0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2a5d0 53 54 52 49 4e 47 0a 20 20 20 20 20 26 26 20 70  STRING.     && p
2a5e0 41 2d 3e 6f 70 21 3d 54 4b 5f 54 52 55 45 46 41  A->op!=TK_TRUEFA
2a5f0 4c 53 45 0a 20 20 20 20 20 26 26 20 28 63 6f 6d  LSE.     && (com
2a600 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
2a610 52 65 64 75 63 65 64 29 3d 3d 30 0a 20 20 20 20  Reduced)==0.    
2a620 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
2a630 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
2a640 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
2a650 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
2a660 6f 70 32 21 3d 70 42 2d 3e 6f 70 32 20 29 20 72  op2!=pB->op2 ) r
2a670 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69  eturn 2;.      i
2a680 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
2a690 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20  B->iTable .     
2a6a0 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65    && (pA->iTable
2a6b0 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28  !=iTab || NEVER(
2a6c0 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20  pB->iTable>=0)) 
2a6d0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
2a6e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2a6f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
2a700 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
2a710 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
2a720 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
2a730 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
2a740 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2a750 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
2a760 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  way..**.** If an
2a770 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
2a780 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
2a790 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
2a7a0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
2a7b0 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
2a7c0 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
2a7d0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
2a7e0 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
2a7f0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  =iTab..**.** Thi
2a800 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2a810 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
2a820 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
2a830 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
2a840 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
2a850 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
2a860 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
2a870 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
2a880 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
2a890 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
2a8a0 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
2a8b0 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
2a8c0 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
2a8d0 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
2a8e0 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
2a8f0 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
2a900 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
2a910 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
2a920 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
2a930 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
2a940 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
2a950 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
2a960 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2a970 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
2a980 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
2a990 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  st *pB, int iTab
2a9a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2a9b0 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
2a9c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2a9d0 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
2a9e0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2a9f0 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
2aa00 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
2aa10 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
2aa20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
2aa30 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
2aa40 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
2aa50 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
2aa60 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
2aa70 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
2aa80 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
2aa90 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
2aaa0 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
2aab0 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
2aac0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2aad0 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  , pExprA, pExprB
2aae0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
2aaf0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2ab00 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b   0;.}../*.** Lik
2ab10 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  e sqlite3ExprCom
2ab20 70 61 72 65 28 29 20 65 78 63 65 70 74 20 43 4f  pare() except CO
2ab30 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
2ab40 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  at the top-level
2ab50 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  .** are ignored.
2ab60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2ab70 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 45  xprCompareSkip(E
2ab80 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
2ab90 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
2aba0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2abb0 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20 20 20  prCompare(0,.   
2abc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2abd0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2abe0 28 70 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20  (pA),.          
2abf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
2ac00 69 70 43 6f 6c 6c 61 74 65 28 70 42 29 2c 0a 20  ipCollate(pB),. 
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
2ac20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2ac30 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 45  rn non-zero if E
2ac40 78 70 72 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62  xpr p can only b
2ac50 65 20 74 72 75 65 20 69 66 20 70 4e 4e 20 69 73  e true if pNN is
2ac60 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74   not NULL..*/.st
2ac70 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 6d 70  atic int exprImp
2ac80 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28 0a 20 20 50  liesNotNull(.  P
2ac90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2aca0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2acb0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
2acc0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
2acd0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2ace0 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
2acf0 2f 0a 20 20 45 78 70 72 20 2a 70 4e 4e 2c 20 20  /.  Expr *pNN,  
2ad00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
2ad10 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
2ad20 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20  s NOT NULL */.  
2ad30 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
2ad40 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
2ad50 6e 67 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a  ng evaluated */.
2ad60 20 20 69 6e 74 20 73 65 65 6e 4e 6f 74 20 20 20    int seenNot   
2ad70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ad80 20 70 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64   p is an operand
2ad90 20 6f 66 20 4e 4f 54 20 2a 2f 0a 29 7b 0a 20 20   of NOT */.){.  
2ada0 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
2adb0 73 73 65 72 74 28 20 70 4e 4e 20 29 3b 0a 20 20  ssert( pNN );.  
2adc0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
2add0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2ade0 2c 20 70 4e 4e 2c 20 69 54 61 62 29 3d 3d 30 20  , pNN, iTab)==0 
2adf0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 77  ) return 1;.  sw
2ae00 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
2ae10 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
2ae20 0a 20 20 20 20 20 20 69 66 28 20 73 65 65 6e 4e  .      if( seenN
2ae30 6f 74 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  ot && ExprHasPro
2ae40 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
2ae50 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
2ae60 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
2ae70 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
2ae80 28 70 2c 45 50 5f 78 49 73 53 65 6c 65 63 74 29  (p,EP_xIsSelect)
2ae90 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
2aea0 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26  p->x.pList!=0 &&
2aeb0 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78   p->x.pList->nEx
2aec0 70 72 3e 30 29 20 29 3b 0a 20 20 20 20 20 20 72  pr>0) );.      r
2aed0 65 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65  eturn exprImplie
2aee0 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c  sNotNull(pParse,
2aef0 20 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20   p->pLeft, pNN, 
2af00 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a  iTab, seenNot);.
2af10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
2af20 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
2af30 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2af40 73 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b  st = p->x.pList;
2af50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2af60 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  List!=0 );.     
2af70 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
2af80 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
2af90 20 20 69 66 28 20 73 65 65 6e 4e 6f 74 20 29 20    if( seenNot ) 
2afa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2afb0 69 66 28 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  if( exprImpliesN
2afc0 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2afd0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
2afe0 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65 65  , pNN, iTab, see
2aff0 6e 4e 6f 74 29 0a 20 20 20 20 20 20 20 7c 7c 20  nNot).       || 
2b000 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2b010 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  ll(pParse, pList
2b020 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2c 20 70 4e  ->a[1].pExpr, pN
2b030 4e 2c 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74  N, iTab, seenNot
2b040 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2b050 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2b060 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2b070 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  n exprImpliesNot
2b080 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e  Null(pParse, p->
2b090 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62  pLeft, pNN, iTab
2b0a0 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20  , seenNot);.    
2b0b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  }.    case TK_EQ
2b0c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
2b0d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  :.    case TK_LT
2b0e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
2b0f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
2b100 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
2b110 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
2b120 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
2b130 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
2b140 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
2b150 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
2b160 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
2b170 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
2b180 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
2b190 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
2b1a0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
2b1b0 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
2b1c0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
2b1d0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70   {.      if( exp
2b1e0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2b1f0 70 50 61 72 73 65 2c 20 70 2d 3e 70 52 69 67 68  pParse, p->pRigh
2b200 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73 65  t, pNN, iTab, se
2b210 65 6e 4e 6f 74 29 20 29 20 72 65 74 75 72 6e 20  enNot) ) return 
2b220 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  1;.      /* Fall
2b230 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 6e   thru into the n
2b240 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
2b250 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50  }.    case TK_SP
2b260 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AN:.    case TK_
2b270 43 4f 4c 4c 41 54 45 3a 0a 20 20 20 20 63 61 73  COLLATE:.    cas
2b280 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
2b290 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a   case TK_UPLUS:.
2b2a0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
2b2b0 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
2b2c0 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  rn exprImpliesNo
2b2d0 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d  tNull(pParse, p-
2b2e0 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61  >pLeft, pNN, iTa
2b2f0 62 2c 20 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20  b, seenNot);.   
2b300 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
2b310 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 66  RUTH: {.      if
2b320 28 20 73 65 65 6e 4e 6f 74 20 29 20 72 65 74 75  ( seenNot ) retu
2b330 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
2b340 70 2d 3e 6f 70 32 21 3d 54 4b 5f 49 53 20 29 20  p->op2!=TK_IS ) 
2b350 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2b360 72 65 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69  return exprImpli
2b370 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65  esNotNull(pParse
2b380 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c  , p->pLeft, pNN,
2b390 20 69 54 61 62 2c 20 73 65 65 6e 4e 6f 74 29 3b   iTab, seenNot);
2b3a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2b3b0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
2b3c0 72 65 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69  return exprImpli
2b3d0 65 73 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65  esNotNull(pParse
2b3e0 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c  , p->pLeft, pNN,
2b3f0 20 69 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d   iTab, 1);.    }
2b400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2b410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b420 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
2b430 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
2b440 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
2b450 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
2b460 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
2b470 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
2b480 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
2b490 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
2b4a0 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
2b4b0 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
2b4c0 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
2b4d0 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
2b4e0 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
2b4f0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2b500 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
2b510 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
2b520 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
2b530 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
2b540 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
2b550 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
2b560 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
2b570 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
2b580 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
2b590 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
2b5a0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
2b5b0 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
2b5c0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2b5d0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
2b5e0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
2b5f0 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
2b600 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
2b610 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
2b620 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
2b630 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
2b640 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
2b650 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
2b660 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
2b670 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
2b680 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
2b690 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
2b6a0 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
2b6b0 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
2b6c0 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
2b6d0 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iTab..**.** If 
2b6e0 70 50 61 72 73 65 20 69 73 20 6e 6f 74 20 4e 55  pParse is not NU
2b6f0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  LL, then the val
2b700 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 76 61 72  ues of bound var
2b710 69 61 62 6c 65 73 20 69 6e 20 70 45 31 20 61 72  iables in pE1 ar
2b720 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 65 64 20 61  e .** compared a
2b730 67 61 69 6e 73 74 20 6c 69 74 65 72 61 6c 20 76  gainst literal v
2b740 61 6c 75 65 73 20 69 6e 20 70 45 32 20 61 6e 64  alues in pE2 and
2b750 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2d 3e   pParse->pVdbe->
2b760 65 78 70 6d 61 73 6b 20 69 73 0a 2a 2a 20 6d 6f  expmask is.** mo
2b770 64 69 66 69 65 64 20 74 6f 20 72 65 63 6f 72 64  dified to record
2b780 20 77 68 69 63 68 20 62 6f 75 6e 64 20 76 61 72   which bound var
2b790 69 61 62 6c 65 73 20 61 72 65 20 72 65 66 65 72  iables are refer
2b7a0 65 6e 63 65 64 2e 20 20 49 66 20 70 50 61 72 73  enced.  If pPars
2b7b0 65 20 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74  e .** is NULL, t
2b7c0 68 65 6e 20 66 61 6c 73 65 20 77 69 6c 6c 20 62  hen false will b
2b7d0 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70 45  e returned if pE
2b7e0 31 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 62  1 contains any b
2b7f0 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 73 2e 0a  ound variables..
2b800 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
2b810 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
2b820 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
2b830 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
2b840 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2b850 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
2b860 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
2b870 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
2b880 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
2b890 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
2b8a0 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
2b8b0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
2b8c0 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
2b8d0 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
2b8e0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
2b8f0 69 65 73 45 78 70 72 28 50 61 72 73 65 20 2a 70  iesExpr(Parse *p
2b900 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 31  Parse, Expr *pE1
2b910 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
2b920 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
2b930 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2b940 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2b950 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
2b960 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2b970 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
2b980 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
2b990 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2b9a0 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31 2c  xpr(pParse, pE1,
2b9b0 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
2b9c0 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
2b9d0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
2b9e0 70 6c 69 65 73 45 78 70 72 28 70 50 61 72 73 65  pliesExpr(pParse
2b9f0 2c 20 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  , pE1, pE2->pRig
2ba00 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
2ba10 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2ba20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
2ba30 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
2ba40 26 26 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  && exprImpliesNo
2ba50 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 45  tNull(pParse, pE
2ba60 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
2ba70 54 61 62 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  Tab, 0).  ){.   
2ba80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2ba90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2baa0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
2bab0 45 78 70 72 20 6e 6f 64 65 20 63 61 6c 6c 62 61  Expr node callba
2bac0 63 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78  ck for sqlite3Ex
2bad0 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2bae0 52 6f 77 28 29 2e 0a 2a 2a 20 49 66 20 74 68 65  Row()..** If the
2baf0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2bb00 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 74   requires that t
2bb10 68 65 20 74 61 62 6c 65 20 61 74 20 70 57 61 6c  he table at pWal
2bb20 6b 65 72 2d 3e 69 43 75 72 0a 2a 2a 20 68 61 76  ker->iCur.** hav
2bb30 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 6f  e one or more no
2bb40 6e 2d 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74  n-NULL column, t
2bb50 68 65 6e 20 73 65 74 20 70 57 61 6c 6b 65 72 2d  hen set pWalker-
2bb60 3e 65 43 6f 64 65 20 74 6f 20 31 20 61 6e 64 20  >eCode to 1 and 
2bb70 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abort..**.** Thi
2bb80 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 74 72 6f  s routine contro
2bb90 6c 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ls an optimizati
2bba0 6f 6e 2e 20 20 46 61 6c 73 65 20 70 6f 73 69 74  on.  False posit
2bbb0 69 76 65 73 20 28 73 65 74 74 69 6e 67 0a 2a 2a  ives (setting.**
2bbc0 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2bbd0 74 6f 20 31 20 77 68 65 6e 20 69 74 20 73 68 6f  to 1 when it sho
2bbe0 75 6c 64 20 6e 6f 74 20 62 65 29 20 61 72 65 20  uld not be) are 
2bbf0 64 65 61 64 6c 79 2c 20 62 75 74 20 66 61 6c 73  deadly, but fals
2bc00 65 2d 6e 65 67 61 74 69 76 65 73 0a 2a 2a 20 28  e-negatives.** (
2bc10 6e 65 76 65 72 20 73 65 74 74 69 6e 67 20 70 57  never setting pW
2bc20 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 29 20 69 73  alker->eCode) is
2bc30 20 61 20 68 61 72 6d 6c 65 73 73 20 6d 69 73 73   a harmless miss
2bc40 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ed optimization.
2bc50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
2bc60 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f 77  mpliesNotNullRow
2bc70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2bc80 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2bc90 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2bca0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
2bcb0 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61  LUMN );.  testca
2bcc0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2bcd0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2bce0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
2bcf0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2bd00 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
2bd10 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2bd20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
2bd30 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2bd40 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61  TK_ISNOT:.    ca
2bd50 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63  se TK_NOT:.    c
2bd60 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
2bd70 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
2bd80 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
2bd90 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
2bda0 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
2bdb0 43 41 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54  CASE:.    case T
2bdc0 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IN:.    case T
2bdd0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
2bde0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2bdf0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
2be00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2be10 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
2be20 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _NOT );.      te
2be30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2be40 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
2be50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2be60 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
2be70 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  TNULL );.      t
2be80 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2be90 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
2bea0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2beb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
2bec0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2bed0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2bee0 41 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASE );.      tes
2bef0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2bf00 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20  ==TK_IN );.     
2bf10 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2bf20 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
2bf30 4e 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  N );.      retur
2bf40 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
2bf50 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2bf60 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
2bf70 65 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70  er->u.iCur==pExp
2bf80 72 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  r->iTable ){.   
2bf90 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
2bfa0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2bfb0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2bfc0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2bfd0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2bfe0 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75  e;..    /* Virtu
2bff0 61 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c  al tables are al
2c000 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e  lowed to use con
2c010 73 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d  straints like x=
2c020 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  NULL.  So.    **
2c030 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66   a term of the f
2c040 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74  orm x=y does not
2c050 20 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73   prove that y is
2c060 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20   not null if x. 
2c070 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c     ** is the col
2c080 75 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c  umn of a virtual
2c090 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61   table */.    ca
2c0a0 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61  se TK_EQ:.    ca
2c0b0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
2c0c0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
2c0d0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
2c0e0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
2c0f0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20  se TK_GE:.      
2c100 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c110 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
2c120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c130 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
2c140 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2c150 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c160 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
2c170 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2c180 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
2c190 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2c1a0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20  >op==TK_GT );.  
2c1b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2c1c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29  xpr->op==TK_GE )
2c1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 78  ;.      if( (pEx
2c1e0 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
2c1f0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69  K_COLUMN && IsVi
2c200 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 4c 65  rtual(pExpr->pLe
2c210 66 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20  ft->y.pTab)).   
2c220 20 20 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 70      || (pExpr->p
2c230 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
2c240 4c 55 4d 4e 20 26 26 20 49 73 56 69 72 74 75 61  LUMN && IsVirtua
2c250 6c 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  l(pExpr->pRight-
2c260 3e 79 2e 70 54 61 62 29 29 0a 20 20 20 20 20 20  >y.pTab)).      
2c270 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  ){.       return
2c280 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2c290 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
2c2a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2c2b0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
2c2c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c2d0 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
2c2e0 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  if expression p 
2c2f0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  can only be true
2c300 20 69 66 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20   if at least.** 
2c310 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
2c320 62 6c 65 20 69 54 61 62 20 69 73 20 6e 6f 6e 2d  ble iTab is non-
2c330 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  null.  In other 
2c340 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72  words, return tr
2c350 75 65 0a 2a 2a 20 69 66 20 65 78 70 72 65 73 73  ue.** if express
2c360 69 6f 6e 20 70 20 77 69 6c 6c 20 61 6c 77 61 79  ion p will alway
2c370 73 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61 6c  s be NULL or fal
2c380 73 65 20 69 66 20 65 76 65 72 79 20 63 6f 6c 75  se if every colu
2c390 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73  mn of iTab.** is
2c3a0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c   NULL..**.** Fal
2c3b0 73 65 20 6e 65 67 61 74 69 76 65 73 20 61 72 65  se negatives are
2c3c0 20 61 63 63 65 70 74 61 62 6c 65 2e 20 20 49 6e   acceptable.  In
2c3d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
2c3e0 20 69 73 20 6f 6b 20 74 6f 20 72 65 74 75 72 6e   is ok to return
2c3f0 0a 2a 2a 20 7a 65 72 6f 20 65 76 65 6e 20 69 66  .** zero even if
2c400 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
2c410 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65  ll never be true
2c420 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   of every column
2c430 20 6f 66 20 69 54 61 62 0a 2a 2a 20 69 73 20 4e   of iTab.** is N
2c440 55 4c 4c 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  ULL.  A false ne
2c450 67 61 74 69 76 65 20 69 73 20 6d 65 72 65 6c 79  gative is merely
2c460 20 61 20 6d 69 73 73 65 64 20 6f 70 74 69 6d 69   a missed optimi
2c470 7a 61 74 69 6f 6e 20 6f 70 70 6f 72 74 75 6e 69  zation opportuni
2c480 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c 73 65 20  ty..**.** False 
2c490 70 6f 73 69 74 69 76 65 73 20 61 72 65 20 6e 6f  positives are no
2c4a0 74 20 61 6c 6c 6f 77 65 64 2c 20 68 6f 77 65 76  t allowed, howev
2c4b0 65 72 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73  er.  A false pos
2c4c0 69 74 69 76 65 20 6d 61 79 20 72 65 73 75 6c 74  itive may result
2c4d0 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  .** in an incorr
2c4e0 65 63 74 20 61 6e 73 77 65 72 2e 0a 2a 2a 0a 2a  ect answer..**.*
2c4f0 2a 20 54 65 72 6d 73 20 6f 66 20 70 20 74 68 61  * Terms of p tha
2c500 74 20 61 72 65 20 6d 61 72 6b 65 64 20 77 69 74  t are marked wit
2c510 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 28 61  h EP_FromJoin (a
2c520 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20 63 6f  nd hence that co
2c530 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 4f  me from.** the O
2c540 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2c550 65 73 20 6f 66 20 4c 45 46 54 20 4a 4f 49 4e 53  es of LEFT JOINS
2c560 29 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 66  ) are excluded f
2c570 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 73 69 73  rom the analysis
2c580 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c590 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
2c5a0 63 68 65 63 6b 20 69 66 20 61 20 4c 45 46 54 20  check if a LEFT 
2c5b0 4a 4f 49 4e 20 63 61 6e 20 62 65 20 63 6f 6e 76  JOIN can be conv
2c5c0 65 72 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 6e  erted into.** an
2c5d0 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 20   ordinary JOIN. 
2c5e0 20 54 68 65 20 70 20 61 72 67 75 6d 65 6e 74 20   The p argument 
2c5f0 69 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  is the WHERE cla
2c600 75 73 65 2e 20 20 49 66 20 74 68 65 20 57 48 45  use.  If the WHE
2c610 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 72 65 71  RE.** clause req
2c620 75 69 72 65 73 20 74 68 61 74 20 73 6f 6d 65 20  uires that some 
2c630 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 69  column of the ri
2c640 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ght table of the
2c650 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 62 65   LEFT JOIN.** be
2c660 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
2c670 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  the LEFT JOIN ca
2c680 6e 20 62 65 20 73 61 66 65 6c 79 20 63 6f 6e 76  n be safely conv
2c690 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 0a 2a 2a  erted into an.**
2c6a0 20 6f 72 64 69 6e 61 72 79 20 6a 6f 69 6e 2e 0a   ordinary join..
2c6b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2c6c0 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
2c6d0 52 6f 77 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  Row(Expr *p, int
2c6e0 20 69 54 61 62 29 7b 0a 20 20 57 61 6c 6b 65 72   iTab){.  Walker
2c6f0 20 77 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   w;.  p = sqlite
2c700 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
2c710 28 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  (p);.  while( p 
2c720 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  ){.    if( p->op
2c730 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 7b 0a  ==TK_NOTNULL ){.
2c740 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65        p = p->pLe
2c750 66 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ft;.    }else if
2c760 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ( p->op==TK_AND 
2c770 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
2c780 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
2c790 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 4c 65  onNullRow(p->pLe
2c7a0 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ft, iTab) ) retu
2c7b0 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 20 3d 20  rn 1;.      p = 
2c7c0 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 7d  p->pRight;.    }
2c7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
2c7e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  k;.    }.  }.  w
2c7f0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2c800 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52   impliesNotNullR
2c810 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ow;.  w.xSelectC
2c820 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
2c830 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c840 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65  2 = 0;.  w.eCode
2c850 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72   = 0;.  w.u.iCur
2c860 20 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74   = iTab;.  sqlit
2c870 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2c880 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
2c890 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ode;.}../*.** An
2c8a0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2c8b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2c8c0 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
2c8d0 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
2c8e0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2c8f0 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
2c900 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
2c910 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
2c920 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
2c930 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
2c940 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
2c950 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
2c960 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
2c970 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
2c980 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
2c990 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
2c9a0 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
2c9b0 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
2c9c0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
2c9d0 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
2c9e0 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
2c9f0 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
2ca00 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2ca10 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2ca20 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
2ca30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2ca40 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
2ca50 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
2ca60 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
2ca70 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
2ca80 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2ca90 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
2caa0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
2cab0 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
2cac0 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
2cad0 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
2cae0 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
2caf0 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
2cb00 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2cb10 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
2cb20 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
2cb30 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2cb40 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2cb50 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
2cb60 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
2cb70 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
2cb80 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2cb90 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
2cba0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
2cbb0 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ex(pWalker->u.pI
2cbc0 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70  dxCover->pIdx, p
2cbd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30  Expr->iColumn)<0
2cbe0 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  .  ){.    pWalke
2cbf0 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2cc00 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2cc10 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
2cc20 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2cc30 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
2cc40 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49  e if an index pI
2cc50 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  dx on table with
2cc60 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e   cursor iCur con
2cc70 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68  tains will.** th
2cc80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
2cc90 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  pr.  Return true
2cca0 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f   if the index do
2ccb0 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20  es cover the.** 
2ccc0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66  expression and f
2ccd0 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70  alse if the pExp
2cce0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66  r expression ref
2ccf0 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f  erences table co
2cd00 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72  lumns.** that ar
2cd10 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74  e not found in t
2cd20 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  he index pIdx..*
2cd30 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f  *.** An index co
2cd40 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73  vering an expres
2cd50 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  sion means that 
2cd60 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
2cd70 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  an be.** evaluat
2cd80 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68  ed using only th
2cd90 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68  e index and with
2cda0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f  out having to lo
2cdb0 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72  okup the.** corr
2cdc0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
2cdd0 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  entry..*/.int sq
2cde0 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
2cdf0 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20  ByIndex(.  Expr 
2ce00 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
2ce10 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
2ce20 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  e tested */.  in
2ce30 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
2ce40 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2ce50 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63  number for the c
2ce60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2ce70 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
2ce80 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Idx         /* T
2ce90 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69  he index that mi
2cea0 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  ght be used for 
2ceb0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20  coverage */.){. 
2cec0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
2ced0 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f  uct IdxCover xco
2cee0 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  v;.  memset(&w, 
2cef0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
2cf00 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75   xcov.iCur = iCu
2cf10 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d  r;.  xcov.pIdx =
2cf20 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72   pIdx;.  w.xExpr
2cf30 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49  Callback = exprI
2cf40 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70  dxCover;.  w.u.p
2cf50 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76  IdxCover = &xcov
2cf60 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2cf70 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
2cf80 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64    return !w.eCod
2cf90 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e;.}.../*.** An 
2cfa0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2cfb0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2cfc0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
2cfd0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
2cfe0 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
2cff0 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
2d000 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
2d010 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
2d020 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
2d030 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
2d040 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
2d050 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
2d060 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
2d070 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
2d080 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
2d090 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
2d0a0 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
2d0b0 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
2d0c0 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
2d0d0 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
2d0e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d0f0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
2d100 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
2d110 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
2d120 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
2d130 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2d140 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
2d150 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
2d160 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
2d170 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
2d180 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2d190 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
2d1a0 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
2d1b0 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
2d1c0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2d1d0 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
2d1e0 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
2d1f0 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
2d200 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
2d210 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
2d220 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
2d230 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
2d240 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2d250 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
2d260 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
2d270 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
2d280 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
2d290 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
2d2a0 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
2d2b0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2d2c0 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
2d2d0 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
2d2e0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
2d2f0 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
2d300 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
2d310 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
2d320 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2d330 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
2d340 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2d350 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
2d360 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
2d370 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
2d380 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
2d390 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
2d3a0 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
2d3b0 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
2d3c0 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
2d3d0 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
2d3e0 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
2d3f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2d400 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
2d410 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
2d420 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2d430 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
2d440 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
2d450 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
2d460 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
2d470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2d480 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2d490 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
2d4a0 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
2d4b0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
2d4c0 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
2d4d0 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
2d4e0 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
2d4f0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
2d500 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
2d510 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
2d520 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
2d530 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
2d540 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
2d550 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
2d560 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
2d570 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
2d580 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
2d590 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
2d5a0 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
2d5b0 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
2d5c0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
2d5d0 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
2d5e0 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
2d5f0 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
2d600 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
2d610 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
2d620 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
2d630 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
2d640 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2d650 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
2d660 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
2d670 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
2d680 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
2d690 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
2d6a0 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
2d6b0 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
2d6c0 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
2d6d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2d6e0 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
2d6f0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
2d700 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
2d710 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
2d720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2d730 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
2d740 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
2d750 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
2d760 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
2d770 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
2d780 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
2d790 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2d7a0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
2d7b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
2d7c0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
2d7d0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
2d7e0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
2d7f0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
2d800 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
2d810 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
2d820 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
2d830 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
2d840 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
2d850 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
2d860 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
2d870 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
2d880 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
2d890 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
2d8a0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2d8b0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
2d8c0 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
2d8d0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
2d8e0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
2d8f0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
2d900 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2d910 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
2d920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
2d930 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
2d940 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
2d950 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
2d960 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
2d970 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
2d980 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
2d990 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
2d9a0 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
2d9b0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
2d9c0 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
2d9d0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
2d9e0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
2d9f0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
2da00 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
2da10 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
2da20 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
2da30 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
2da40 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
2da50 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
2da60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
2da70 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
2da80 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2da90 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
2daa0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2dab0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2dac0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
2dad0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
2dae0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2daf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
2db00 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
2db10 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
2db20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2db30 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
2db40 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
2db50 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
2db60 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
2db70 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e  ggInfo = pNC->uN
2db80 43 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61  C.pAggInfo;..  a
2db90 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c  ssert( pNC->ncFl
2dba0 61 67 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66  ags & NC_UAggInf
2dbb0 6f 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  o );.  switch( p
2dbc0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
2dbd0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
2dbe0 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
2dbf0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
2dc00 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2dc10 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
2dc20 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
2dc30 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2dc40 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
2dc50 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
2dc60 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
2dc70 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
2dc80 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
2dc90 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
2dca0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
2dcb0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
2dcc0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
2dcd0 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
2dce0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
2dcf0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2dd00 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
2dd10 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
2dd20 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
2dd30 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
2dd40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2dd50 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2dd60 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
2dd70 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2dd80 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2dd90 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
2dda0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2ddb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
2ddc0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
2ddd0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
2dde0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2ddf0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2de00 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
2de10 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
2de20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
2de30 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
2de40 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2de50 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2de60 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
2de70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
2de80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
2de90 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
2dea0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
2deb0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
2dec0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
2ded0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
2dee0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
2def0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
2df00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2df10 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
2df20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
2df30 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
2df40 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
2df50 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2df60 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
2df70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2df80 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
2df90 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
2dfa0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
2dfb0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
2dfc0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
2dfd0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2dfe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2dff0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e000 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e010 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
2e020 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2e030 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
2e040 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
2e050 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
2e060 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
2e070 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
2e080 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e090 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
2e0a0 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
2e0b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2e0c0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70  Tab = pExpr->y.p
2e0d0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
2e0e0 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20     pCol->iTable 
2e0f0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
2e100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2e110 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  Col->iColumn = p
2e120 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
2e130 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2e140 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
2e150 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e160 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
2e170 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31  orterColumn = -1
2e180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e190 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45  pCol->pExpr = pE
2e1a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2e1b0 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d     if( pAggInfo-
2e1c0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2e1e0 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   j, n;.         
2e1f0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
2e200 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d  *pGB = pAggInfo-
2e210 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
2e220 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2e230 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2e240 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b  *pTerm = pGB->a;
2e250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e260 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b   n = pGB->nExpr;
2e270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e280 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a   for(j=0; j<n; j
2e290 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2b0 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d  Expr *pE = pTerm
2e2c0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
2e2d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2e2e0 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  E->op==TK_COLUMN
2e2f0 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d   && pE->iTable==
2e300 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
2e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e320 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
2e330 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
2e340 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
2e350 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2e360 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
2e370 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
2e380 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2e3b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e3d0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
2e3e0 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  terColumn<0 ){. 
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e400 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
2e410 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  mn = pAggInfo->n
2e420 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b  SortingColumn++;
2e430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2e440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2e460 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e  ere is now an en
2e470 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e  try for pExpr in
2e480 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2e490 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20  ] (either.      
2e4a0 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
2e4b0 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65   it was there be
2e4c0 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20  fore or because 
2e4d0 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20  we just created 
2e4e0 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  it)..           
2e4f0 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   ** Convert the 
2e500 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b  pExpr to be a TK
2e510 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65  _AGG_COLUMN refe
2e520 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20  rring to that.  
2e530 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67            ** pAg
2e540 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e  gInfo->aCol[] en
2e550 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
2e560 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2e570 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2e580 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
2e590 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
2e5a0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
2e5b0 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2e5d0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
2e5e0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
2e5f0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
2e600 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
2e610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e620 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
2e630 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2e640 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
2e650 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
2e660 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
2e670 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
2e680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
2e690 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
2e6a0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
2e6b0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
2e6c0 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
2e6d0 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e  gs & NC_InAggFun
2e6e0 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  c)==0.       && 
2e6f0 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
2e700 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32  epth==pExpr->op2
2e710 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2e720 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2e730 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
2e740 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
2e750 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
2e760 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
2e770 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
2e780 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
2e790 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
2e7a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e7b0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2e7c0 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
2e7d0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
2e7e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2e7f0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2e800 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2e810 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2e820 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2e830 72 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 45 78  re(0, pItem->pEx
2e840 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
2e850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2e860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e870 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e880 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
2e890 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
2e8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
2e8b0 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
2e8c0 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
2e8d0 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
2e8e0 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
2e8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
2e900 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
2e910 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
2e920 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
2e930 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
2e940 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
2e950 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
2e960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2e970 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e980 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2e990 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2e9a0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
2e9b0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
2e9c0 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
2e9d0 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
2e9e0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2e9f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
2ea00 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2ea10 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2ea20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2ea30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2ea40 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
2ea60 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
2ea70 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
2ea80 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2eaa0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a  xpr->u.zToken, .
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eac0 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
2ead0 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
2eae0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
2eaf0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
2eb00 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
2eb10 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
2eb20 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
2eb30 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
2eb40 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
2eb50 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
2eb60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb70 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
2eb80 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2eb90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2eba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ebb0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
2ebc0 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
2ebd0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
2ebe0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
2ebf0 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
2ec00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
2ec10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2ec20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2ec30 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2ec40 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
2ec50 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2ec60 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2ec70 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
2ec80 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
2ec90 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
2eca0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
2ecb0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
2ecc0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2ecd0 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
2ece0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ecf0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
2ed00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ed10 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ed20 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
2ed30 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2ed40 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
2ed50 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2ed60 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2ed70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2ed80 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
2ed90 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
2eda0 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75 72  Depth++;.  retur
2edb0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2edc0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  }.static void an
2edd0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2ede0 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b 65  nSelectEnd(Walke
2edf0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2ee00 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2ee10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ee20 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57 61  (pSelect);.  pWa
2ee30 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74  lker->walkerDept
2ee40 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  h--;.}../*.** An
2ee50 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
2ee60 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
2ee70 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
2ee80 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
2ee90 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
2eea0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
2eeb0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
2eec0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
2eed0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
2eee0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
2eef0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
2ef00 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
2ef10 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
2ef20 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
2ef30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ef40 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ef50 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
2ef60 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
2ef70 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
2ef80 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
2ef90 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
2efa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2efb0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2efc0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
2efd0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
2efe0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2eff0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2f000 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
2f010 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ate;.  w.xSelect
2f020 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
2f030 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
2f040 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  lect;.  w.xSelec
2f050 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e 61  tCallback2 = ana
2f060 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
2f070 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e 77  SelectEnd;.  w.w
2f080 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a  alkerDepth = 0;.
2f090 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
2f0a0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 30 3b  .  w.pParse = 0;
2f0b0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2f0c0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
2f0d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2f0e0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
2f0f0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
2f100 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2f110 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
2f120 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
2f130 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
2f140 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
2f150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2f160 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
2f170 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
2f180 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
2f190 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
2f1a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2f1b0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2f1c0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2f1d0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2f1e0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
2f1f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2f200 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
2f210 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
2f220 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
2f230 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
2f240 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
2f250 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
2f260 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2f270 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
2f280 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
2f290 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2f2a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
2f2b0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
2f2c0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
2f2d0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
2f2e0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
2f2f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2f300 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2f310 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2f320 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
2f330 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
2f340 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
2f350 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
2f360 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
2f370 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
2f380 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2f390 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
2f3a0 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
2f3b0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
2f3c0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
2f3d0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
2f3e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2f3f0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
2f400 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
2f410 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
2f420 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
2f430 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
2f440 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 70 50  mpReg) ){.    pP
2f450 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
2f460 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
2f470 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
2f480 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2f490 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
2f4a0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
2f4b0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
2f4c0 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
2f4d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2f4e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2f4f0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
2f500 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52 65   i, n;.  if( nRe
2f510 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73 71  g==1 ) return sq
2f520 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2f530 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20 70  pParse);.  i = p
2f540 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2f550 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
2f560 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
2f570 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
2f580 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2f590 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
2f5a0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
2f5b0 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
2f5c0 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
2f5d0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
2f5e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
2f5f0 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
2f600 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
2f610 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2f620 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
2f630 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
2f640 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52   nReg){.  if( nR
2f650 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  eg==1 ){.    sql
2f660 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2f670 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67 29  eg(pParse, iReg)
2f680 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2f690 7d 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  }.  if( nReg>pPa
2f6a0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
2f6b0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
2f6c0 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
2f6d0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
2f6e0 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
2f6f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
2f700 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65  all temporary re
2f710 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67  gisters as being
2f720 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72   unavailable for
2f730 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   reuse..*/.void 
2f740 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2f750 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
2f760 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
2f770 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
2f780 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
2f790 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  eReg = 0;.}../*.
2f7a0 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74  ** Validate that
2f7b0 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65   no temporary re
2f7c0 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74  gister falls wit
2f7d0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66  hin the range of
2f7e0 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73  .** iFirst..iLas
2f7f0 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54  t, inclusive.  T
2f800 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2f810 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69  nly call from wi
2f820 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a  thin assert().**
2f830 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
2f840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2f850 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  BUG.int sqlite3N
2f860 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61  oTempsInRange(Pa
2f870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
2f880 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61   iFirst, int iLa
2f890 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
2f8a0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  if( pParse->nRan
2f8b0 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50  geReg>0.   && pP
2f8c0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b  arse->iRangeReg+
2f8d0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2f8e0 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26  g > iFirst.   &&
2f8f0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2f900 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b  eg <= iLast.  ){
2f910 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  .     return 0;.
2f920 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2f930 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
2f940 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
2f950 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2f960 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20  g[i]>=iFirst && 
2f970 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
2f980 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  [i]<=iLast ){.  
2f990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2f9a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2f9b0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
2f9c0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.