/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 5814b4b5d4b9e615faba427a554de5152c972cc0132f6968a13250c07b709372:


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 65 58 3d 3d 45 58 5f 53 65 6c  Expr->eX==EX_Sel
0690: 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ect );.    retur
06a0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
06b0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
06c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
06d0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[0].pExpr);.  }
06e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
06f0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45  GISTER ) op = pE
0700: 78 70 72 2d 3e 6f 70 32 3b 0a 23 69 66 6e 64 65  xpr->op2;.#ifnde
0710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
0720: 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  ST.  if( op==TK_
0730: 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73 65  CAST ){.    asse
0740: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
0750: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0760: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
0770: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 66  return sqlite3Af
0780: 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72  finityType(pExpr
0790: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
07a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
07b0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
07c0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
07d0: 4c 55 4d 4e 29 0a 20 20 20 26 26 20 41 4c 57 41  LUMN).   && ALWA
07e0: 59 53 28 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  YS(pExpr->eX==EX
07f0: 5f 54 61 62 29 20 26 26 20 70 45 78 70 72 2d 3e  _Tab) && pExpr->
0800: 78 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  x.pTab ){.    re
0810: 74 75 72 6e 20 73 71 6c 69 74 65 33 54 61 62 6c  turn sqlite3Tabl
0820: 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
0830: 70 45 78 70 72 2d 3e 78 2e 70 54 61 62 2c 20 70  pExpr->x.pTab, p
0840: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
0850: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
0860: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29  _SELECT_COLUMN )
0870: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0880: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 65 58 3d 3d  xpr->pLeft->eX==
0890: 45 58 5f 53 65 6c 65 63 74 20 29 3b 0a 20 20 20  EX_Select );.   
08a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
08b0: 78 70 72 41 66 66 69 6e 69 74 79 28 0a 20 20 20  xprAffinity(.   
08c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
08d0: 74 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  t->x.pSelect->pE
08e0: 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
08f0: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 0a 20 20  Column].pExpr.  
0900: 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
0910: 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  n pExpr->affinit
0920: 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  y;.}../*.** Set 
0930: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
0940: 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70 72 65  quence for expre
0950: 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20 62  ssion pExpr to b
0960: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  e the collating.
0970: 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  ** sequence name
0980: 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52  d by pToken.   R
0990: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
09a0: 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20 6e 6f  to a new Expr no
09b0: 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  de that.** imple
09c0: 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c 41 54  ments the COLLAT
09d0: 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
09e0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
09f0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
0a00: 63 63 75 72 73 2c 20 74 68 61 74 20 66 61 63 74  ccurs, that fact
0a10: 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
0a20: 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20 61 6e  pParse->db.** an
0a30: 64 20 74 68 65 20 70 45 78 70 72 20 70 61 72 61  d the pExpr para
0a40: 6d 65 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  meter is returne
0a50: 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  d unchanged..*/.
0a60: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0a70: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0a80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0a90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
0aa0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
0ab0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
0ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
0ad0: 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c 41 54   Add the "COLLAT
0ae0: 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74 68 69  E" clause to thi
0af0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
0b00: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
0b10: 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61  CollName,  /* Na
0b20: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20  me of collating 
0b30: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 69 6e  sequence */.  in
0b40: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
0b50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
0b60: 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c 6c 4e  o dequote pCollN
0b70: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ame */.){.  if( 
0b80: 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30 20 29  pCollName->n>0 )
0b90: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
0ba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
0bb0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
0bc0: 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c  TK_COLLATE, pCol
0bd0: 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65 29 3b  lName, dequote);
0be0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0bf0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65  .      pNew->pLe
0c00: 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ft = pExpr;.    
0c10: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
0c20: 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50 5f 53   EP_Collate|EP_S
0c30: 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78 70 72  kip;.      pExpr
0c40: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
0c50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0c60: 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c 69 74  r;.}.Expr *sqlit
0c70: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0c80: 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a 70 50  String(Parse *pP
0c90: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0ca0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
0cb0: 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b 0a 20  C){.  Token s;. 
0cc0: 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30 20 29   assert( zC!=0 )
0cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  ;.  sqlite3Token
0ce0: 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72 2a 29  Init(&s, (char*)
0cf0: 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  zC);.  return sq
0d00: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
0d10: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
0d20: 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29 3b 0a   pExpr, &s, 0);.
0d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76  }../*.** Skip ov
0d40: 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54  er any TK_COLLAT
0d50: 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20  E operators and 
0d60: 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a  any unlikely().*
0d70: 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  * or likelihood(
0d80: 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68  ) function at th
0d90: 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70  e root of an exp
0da0: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
0db0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69   *sqlite3ExprSki
0dc0: 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70  pCollate(Expr *p
0dd0: 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20  Expr){.  while( 
0de0: 70 45 78 70 72 20 26 26 20 45 78 70 72 48 61 73  pExpr && ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20  EP_Skip) ){.    
0e10: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
0e20: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e  rty(pExpr, EP_Un
0e30: 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20  likely) ){.     
0e40: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0e50: 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b 0a 20  eX==EX_List );. 
0e60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0e70: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
0e80: 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  pr>0 );.      as
0e90: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
0ea0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
0eb0: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 45        pExpr = pE
0ec0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
0ed0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  0].pExpr;.    }e
0ee0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
0ef0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0f00: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
0f10: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
0f20: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 7d 0a 20 20  >pLeft;.    }.  
0f30: 7d 20 20 20 0a 20 20 72 65 74 75 72 6e 20 70 45  }   .  return pE
0f40: 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  xpr;.}../*.** Re
0f50: 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  turn the collati
0f60: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
0f70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0f80: 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72  Expr. If.** ther
0f90: 65 20 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20  e is no defined 
0fa0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0fb0: 63 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ce, return NULL.
0fc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
0fd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
0fe0: 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68  llSeq().**.** Th
0ff0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  e sqlite3ExprNNC
1000: 6f 6c 6c 53 65 71 28 29 20 77 6f 72 6b 73 20 74  ollSeq() works t
1010: 68 65 20 73 61 6d 65 20 65 78 61 63 74 20 74 68  he same exact th
1020: 61 74 20 69 74 20 72 65 74 75 72 6e 73 20 74 68  at it returns th
1030: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6c  e.** default col
1040: 6c 61 74 69 6f 6e 20 69 66 20 70 45 78 70 72 20  lation if pExpr 
1050: 68 61 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63  has no defined c
1060: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ollation..**.** 
1070: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
1080: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
1090: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
10a0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
10b0: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
10c0: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
10d0: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
10e0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
10f0: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
1100: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
1110: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
1120: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
1130: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
1140: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
1150: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
1160: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
1170: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
1180: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1190: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
11a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11b0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
11c0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
11d0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
11e0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
11f0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1200: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1210: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1220: 6b 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d  k;.    if( (op==
1230: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
1240: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20   op==TK_COLUMN. 
1250: 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d           || op==
1260: 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f  TK_REGISTER || o
1270: 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20  p==TK_TRIGGER). 
1280: 20 20 20 20 26 26 20 70 2d 3e 65 58 3d 3d 45 58      && p->eX==EX
1290: 5f 54 61 62 0a 20 20 20 20 20 26 26 20 70 2d 3e  _Tab.     && p->
12a0: 78 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b  x.pTab!=0.    ){
12b0: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
12c0: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
12d0: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
12e0: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
12f0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
1300: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
1310: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
1320: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
1330: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
1340: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ster */.      in
1350: 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  t j = p->iColumn
1360: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30  ;.      if( j>=0
1370: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1380: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
1390: 70 2d 3e 78 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b  p->x.pTab->aCol[
13a0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
13b0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13c0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13d0: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
13e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1400: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1410: 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50  AST || op==TK_UP
1420: 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d  LUS ){.      p =
1430: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
1440: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1450: 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  .    if( op==TK_
1460: 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d  COLLATE || (op==
1470: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
1480: 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  ->op2==TK_COLLAT
1490: 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  E) ){.      pCol
14a0: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
14b0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e  llSeq(pParse, EN
14c0: 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a  C(db), 0, p->u.z
14d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
14e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
14f0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
1500: 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
1510: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
1520: 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  & (p->pLeft->fla
1530: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
1540: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1550: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
1560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1570: 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20 3d 20    Expr *pNext = 
1580: 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  0;.        /* p-
1590: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
15a0: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
15b0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
15c0: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
15d0: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
15e0: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
15f0: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1600: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1610: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1620: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
1630: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
1640: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
1650: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
1660: 69 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f 4c 69  if( p->eX==EX_Li
1670: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1680: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
1690: 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53   for(i=0; ALWAYS
16a0: 28 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  (i<p->x.pList->n
16b0: 45 78 70 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Expr); i++){.   
16c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70           if( Exp
16d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
16e0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
16f0: 78 70 72 2c 20 45 50 5f 43 6f 6c 6c 61 74 65 29  xpr, EP_Collate)
1700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1710: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70    pNext = p->x.p
1720: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1750: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1760: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1770: 66 28 20 70 2d 3e 65 58 3d 3d 45 58 5f 52 69 67  f( p->eX==EX_Rig
1780: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ht ){.          
1790: 70 4e 65 78 74 20 3d 20 70 2d 3e 78 2e 70 52 69  pNext = p->x.pRi
17a0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ght;.        }. 
17b0: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
17c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17d0: 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
17e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17f0: 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  ( sqlite3CheckCo
1800: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
1810: 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f  oll) ){ .    pCo
1820: 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ll = 0;.  }.  re
1830: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
1840: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1850: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1860: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
1870: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
1880: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
1890: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
18a0: 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72   sequence, retur
18b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
18c0: 68 65 0a 2a 2a 20 64 65 66 61 75 74 6c 20 63 6f  he.** defautl co
18d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18e0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
18f0: 3a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  : sqlite3ExprCol
1900: 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65  lSeq().**.** The
1910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1920: 53 65 71 28 29 20 72 6f 75 74 69 6e 65 20 77 6f  Seq() routine wo
1930: 72 6b 73 20 74 68 65 20 73 61 6d 65 20 65 78 63  rks the same exc
1940: 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 72  ept that it.** r
1950: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1960: 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e  here is no defin
1970: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  ed collation..*/
1980: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
1990: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 50  3ExprNNCollSeq(P
19a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19b0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
19c0: 6c 6c 53 65 71 20 2a 70 20 3d 20 73 71 6c 69 74  llSeq *p = sqlit
19d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
19e0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
19f0: 69 66 28 20 70 3d 3d 30 20 29 20 70 20 3d 20 70  if( p==0 ) p = p
1a00: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1a10: 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Coll;.  assert( 
1a20: 70 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p!=0 );.  return
1a30: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
1a40: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1a50: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
1a60: 68 61 76 65 20 65 71 75 69 76 61 6c 65 6e 74 20  have equivalent 
1a70: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1a80: 63 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ces..*/.int sqli
1a90: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d 61  te3ExprCollSeqMa
1aa0: 74 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  tch(Parse *pPars
1ab0: 65 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78  e, Expr *pE1, Ex
1ac0: 70 72 20 2a 70 45 32 29 7b 0a 20 20 43 6f 6c 6c  pr *pE2){.  Coll
1ad0: 53 65 71 20 2a 70 43 6f 6c 6c 31 20 3d 20 73 71  Seq *pColl1 = sq
1ae0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
1af0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 31 29 3b  eq(pParse, pE1);
1b00: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1b10: 6c 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l2 = 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 32 29 3b 0a 20 20 72 65 74 75 72 6e  , pE2);.  return
1b40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1b50: 70 43 6f 6c 6c 31 2d 3e 7a 4e 61 6d 65 2c 20 70  pColl1->zName, p
1b60: 43 6f 6c 6c 32 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  Coll2->zName)==0
1b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1b80: 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f   is an operand o
1b90: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
1ba0: 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69  perator.  aff2 i
1bb0: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1bc0: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74  finity of the ot
1bd0: 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  her operand.  Th
1be0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1bf0: 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  ns the.** type a
1c00: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
1c10: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
1c20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  the comparison o
1c30: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72  perator..*/.char
1c40: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1c50: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
1c60: 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b  xpr, char aff2){
1c70: 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73  .  char aff1 = s
1c80: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1c90: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
1ca0: 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b   aff1 && aff2 ){
1cb0: 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64  .    /* Both sid
1cc0: 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  es of the compar
1cd0: 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ison are columns
1ce0: 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d  . If one has num
1cf0: 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69  eric.    ** affi
1d00: 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20  nity, use that. 
1d10: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f  Otherwise use no
1d20: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
1d30: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1d40: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
1d50: 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69  ty(aff1) || sqli
1d60: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1d70: 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20  nity(aff2) ){.  
1d80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d90: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
1da0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1db0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1dc0: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20  F_BLOB;.    }.  
1dd0: 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20  }else if( !aff1 
1de0: 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20  && !aff2 ){.    
1df0: 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20  /* Neither side 
1e00: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
1e10: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n is a column.  
1e20: 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20  Compare the.    
1e30: 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63  ** results direc
1e40: 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
1e50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
1e60: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b  F_BLOB;.  }else{
1e70: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65  .    /* One side
1e80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
1e90: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20  e other is not. 
1ea0: 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  Use the columns 
1eb0: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
1ec0: 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30   assert( aff1==0
1ed0: 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20   || aff2==0 );. 
1ee0: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
1ef0: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
1f00: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1f10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1f20: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
1f30: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
1f40: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
1f50: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
1f60: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
1f70: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
1f80: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
1f90: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
1fa0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
1fb0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
1fc0: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
1fd0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
1fe0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
1ff0: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
2000: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
2010: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
2020: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
2030: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
2040: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
2050: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
2060: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op==TK_NE || 
2070: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2080: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
2090: 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73  K_ISNOT );.  ass
20a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
20b0: 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c  t );.  aff = sql
20c0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
20d0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
20e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 58 3d    if( pExpr->eX=
20f0: 3d 45 58 5f 52 69 67 68 74 20 29 7b 0a 20 20 20  =EX_Right ){.   
2100: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
2110: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
2120: 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 61  xpr->x.pRight, a
2130: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ff);.  }else if(
2140: 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53   pExpr->eX==EX_S
2150: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66  elect ){.    aff
2160: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
2170: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
2180: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2190: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
21a0: 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  aff);.  }else if
21b0: 28 20 61 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  ( aff==0 ){.    
21c0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
21d0: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
21e0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
21f0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
2200: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
2210: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
2220: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
2230: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
2240: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
2250: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
2260: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
2270: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
2280: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
2290: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
22a0: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
22b0: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
22c0: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
22d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
22e0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
22f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
2300: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
2310: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
2320: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
2330: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
2340: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
2350: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  e SQLITE_AFF_BLO
2360: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
2370: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
2380: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
2390: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
23a0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
23b0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
23c0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
23d0: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
23e0: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
23f0: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
2400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2410: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
2420: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2430: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
2440: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
2450: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
2460: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
2470: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
2480: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
2490: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
24a0: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
24b0: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
24c0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
24d0: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
24e0: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
24f0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
2500: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
2510: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
2520: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
2530: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
2540: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
2550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2560: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2570: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
2580: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
2590: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
25a0: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
25b0: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
25c0: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
25d0: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
25e0: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
25f0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
2600: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2610: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
2620: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
2630: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
2640: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
2650: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
2660: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
2670: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
2680: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
2690: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
26a0: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
26b0: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
26c0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
26d0: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
26e0: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
26f0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
2700: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
2710: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
2720: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  d..**.** The sec
2730: 6f 6e 64 20 66 6f 72 6d 20 28 73 71 6c 69 74 65  ond form (sqlite
2740: 33 42 69 6e 61 72 79 45 78 70 72 43 6f 6c 6c 53  3BinaryExprCollS
2750: 65 71 28 29 29 20 75 73 65 73 20 74 68 65 20 45  eq()) uses the E
2760: 78 70 72 2e 70 4c 65 66 74 0a 2a 2a 20 61 6e 64  xpr.pLeft.** and
2770: 20 45 78 70 72 2e 78 2e 70 52 69 67 68 74 20 70   Expr.x.pRight p
2780: 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
2790: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
27a0: 69 6e 73 74 65 61 64 20 6f 66 20 73 65 70 61 72  instead of separ
27b0: 61 74 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 2e  ate.** pointers.
27c0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
27d0: 69 74 65 33 43 6f 6d 70 61 72 69 73 6f 6e 43 6f  ite3ComparisonCo
27e0: 6c 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a  llSeq(.  Parse *
27f0: 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
2800: 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20  *pLeft, .  Expr 
2810: 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c  *pRight.){.  Col
2820: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61  lSeq *pColl;.  a
2830: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
2840: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61    if( pLeft->fla
2850: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
2860: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
2870: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2880: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
2890: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
28a0: 69 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d  ight && (pRight-
28b0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
28c0: 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ate)!=0 ){.    p
28d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
28e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
28f0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
2900: 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  se{.    pColl = 
2910: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2920: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2930: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
2940: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  l ){.      pColl
2950: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2960: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52  llSeq(pParse, pR
2970: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2980: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
2990: 0a 7d 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  .}.CollSeq *sqli
29a0: 74 65 33 43 6f 6d 70 61 72 69 73 6f 6e 45 78 70  te3ComparisonExp
29b0: 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  rCollSeq(Parse *
29c0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
29d0: 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
29e0: 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20  r->eX==EX_Right 
29f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
2a00: 6c 69 74 65 33 43 6f 6d 70 61 72 69 73 6f 6e 43  lite3ComparisonC
2a10: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2a20: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
2a30: 70 72 2d 3e 78 2e 70 52 69 67 68 74 29 3b 0a 20  pr->x.pRight);. 
2a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2a50: 72 6e 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  rn sqlite3Compar
2a60: 69 73 6f 6e 43 6f 6c 6c 53 65 71 28 70 50 61 72  isonCollSeq(pPar
2a70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
2a80: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
2a90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
2aa0: 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f   for a compariso
2ab0: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  n operator..*/.s
2ac0: 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f  tatic int codeCo
2ad0: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
2ae0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68  pParse,    /* Th
2af0: 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63  e parsing (and c
2b00: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20  ode generating) 
2b10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
2b20: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f  r *pLeft,      /
2b30: 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * The left opera
2b40: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
2b50: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
2b60: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
2b70: 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20  /.  int opcode, 
2b80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
2b90: 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a  parison opcode *
2ba0: 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74  /.  int in1, int
2bb0: 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65   in2, /* Registe
2bc0: 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e  r holding operan
2bd0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ds */.  int dest
2be0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
2bf0: 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20  p here if true. 
2c00: 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
2c10: 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72  Null    /* If tr
2c20: 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68  ue, jump if eith
2c30: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
2c40: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70  LL */.){.  int p
2c50: 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  5;.  int addr;. 
2c60: 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20   CollSeq *p4;.. 
2c70: 20 70 34 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d   p4 = sqlite3Com
2c80: 70 61 72 69 73 6f 6e 43 6f 6c 6c 53 65 71 28 70  parisonCollSeq(p
2c90: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2ca0: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2cb0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2cc0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2cd0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2ce0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2cf0: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2d00: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2d10: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
2d40: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2d50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2d60: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
2d70: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2d80: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2d90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2da0: 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2db0: 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
2dc0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
2dd0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 65  wise..**.** A ve
2de0: 63 74 6f 72 20 69 73 20 64 65 66 69 6e 65 64 20  ctor is defined 
2df0: 61 73 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  as any expressio
2e00: 6e 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 69  n that results i
2e10: 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  n two or more.**
2e20: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 72 65 73 75   columns of resu
2e30: 6c 74 2e 20 20 45 76 65 72 79 20 54 4b 5f 56 45  lt.  Every TK_VE
2e40: 43 54 4f 52 20 6e 6f 64 65 20 69 73 20 61 6e 20  CTOR node is an 
2e50: 76 65 63 74 6f 72 20 62 65 63 61 75 73 65 20 74  vector because t
2e60: 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 77 69 6c  he.** parser wil
2e70: 6c 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 20 61  l not generate a
2e80: 20 54 4b 5f 56 45 43 54 4f 52 20 77 69 74 68 20   TK_VECTOR with 
2e90: 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 65  fewer than two e
2ea0: 6e 74 72 69 65 73 2e 0a 2a 2a 20 42 75 74 20 61  ntries..** But a
2eb0: 20 54 4b 5f 53 45 4c 45 43 54 20 6d 69 67 68 74   TK_SELECT might
2ec0: 20 62 65 20 65 69 74 68 65 72 20 61 20 76 65 63   be either a vec
2ed0: 74 6f 72 20 6f 72 20 61 20 73 63 61 6c 61 72 2e  tor or a scalar.
2ee0: 20 49 74 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63   It is only.** c
2ef0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 65 63 74  onsidered a vect
2f00: 6f 72 20 69 66 20 69 74 20 68 61 73 20 74 77 6f  or if it has two
2f10: 20 6f 72 20 6d 6f 72 65 20 72 65 73 75 6c 74 20   or more result 
2f20: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  columns..*/.int 
2f30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
2f40: 74 6f 72 28 45 78 70 72 20 2a 70 45 78 70 72 29  tor(Expr *pExpr)
2f50: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2f60: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
2f70: 28 70 45 78 70 72 29 3e 31 3b 0a 7d 0a 0a 2f 2a  (pExpr)>1;.}../*
2f80: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
2f90: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
2fa0: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
2fb0: 74 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f  t is of type TK_
2fc0: 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75 72  VECTOR .** retur
2fd0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2fe0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
2ff0: 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20 69  he vector. Or, i
3000: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
3010: 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
3020: 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ect, return the 
3030: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
3040: 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73 65 6c  s in the sub-sel
3050: 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79 20  ect. For.** any 
3060: 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20 65 78  other type of ex
3070: 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72 6e  pression, return
3080: 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1..*/.int sqlit
3090: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
30a0: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
30b0: 20 75 38 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e   u8 op = pExpr->
30c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
30d0: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
30e0: 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 20 20 69   pExpr->op2;.  i
30f0: 66 28 20 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52  f( op==TK_VECTOR
3100: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3110: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
3120: 45 78 70 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Expr;.  }else if
3130: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
3140: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45  ){.    return pE
3150: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
3160: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
3170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
3180: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
3190: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
31a0: 74 65 72 20 74 6f 20 61 20 73 75 62 65 78 70 72  ter to a subexpr
31b0: 65 73 73 69 6f 6e 20 6f 66 20 70 56 65 63 74 6f  ession of pVecto
31c0: 72 20 74 68 61 74 20 69 73 20 74 68 65 20 69 2d  r that is the i-
31d0: 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20  th.** column of 
31e0: 74 68 65 20 76 65 63 74 6f 72 20 28 6e 75 6d 62  the vector (numb
31f0: 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  ered starting wi
3200: 74 68 20 30 29 2e 20 20 54 68 65 20 63 61 6c 6c  th 0).  The call
3210: 65 72 20 6d 75 73 74 0a 2a 2a 20 65 6e 73 75 72  er must.** ensur
3220: 65 20 74 68 61 74 20 69 20 69 73 20 77 69 74 68  e that i is with
3230: 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20  in range..**.** 
3240: 49 66 20 70 56 65 63 74 6f 72 20 69 73 20 72 65  If pVector is re
3250: 61 6c 6c 79 20 61 20 73 63 61 6c 61 72 20 28 61  ally a scalar (a
3260: 6e 64 20 22 73 63 61 6c 61 72 22 20 68 65 72 65  nd "scalar" here
3270: 20 69 6e 63 6c 75 64 65 73 20 73 75 62 71 75 65   includes subque
3280: 72 69 65 73 0a 2a 2a 20 74 68 61 74 20 72 65 74  ries.** that ret
3290: 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  urn a single col
32a0: 75 6d 6e 21 29 20 74 68 65 6e 20 72 65 74 75 72  umn!) then retur
32b0: 6e 20 70 56 65 63 74 6f 72 20 75 6e 6d 6f 64 69  n pVector unmodi
32c0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 56 65 63  fied..**.** pVec
32d0: 74 6f 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65  tor retains owne
32e0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 72 65 74  rship of the ret
32f0: 75 72 6e 65 64 20 73 75 62 65 78 70 72 65 73 73  urned subexpress
3300: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
3310: 65 20 76 65 63 74 6f 72 20 69 73 20 61 20 28 53  e vector is a (S
3320: 45 4c 45 43 54 20 2e 2e 2e 29 20 74 68 65 6e 20  ELECT ...) then 
3330: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
3340: 65 74 75 72 6e 65 64 20 69 73 0a 2a 2a 20 6a 75  eturned is.** ju
3350: 73 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  st the expressio
3360: 6e 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 74  n for the i-th t
3370: 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
3380: 74 20 73 65 74 2c 20 61 6e 64 20 6d 61 79 0a 2a  t set, and may.*
3390: 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 79 20 66  * not be ready f
33a0: 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 65  or evaluation be
33b0: 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65 20  cause the table 
33c0: 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 79  cursor has not y
33d0: 65 74 0a 2a 2a 20 62 65 65 6e 20 70 6f 73 69 74  et.** been posit
33e0: 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ioned..*/.Expr *
33f0: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
3400: 6c 64 53 75 62 65 78 70 72 28 45 78 70 72 20 2a  ldSubexpr(Expr *
3410: 70 56 65 63 74 6f 72 2c 20 69 6e 74 20 69 29 7b  pVector, int i){
3420: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 73 71 6c  .  assert( i<sql
3430: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
3440: 7a 65 28 70 56 65 63 74 6f 72 29 20 29 3b 0a 20  ze(pVector) );. 
3450: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
3460: 49 73 56 65 63 74 6f 72 28 70 56 65 63 74 6f 72  IsVector(pVector
3470: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
3480: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d 30   pVector->op2==0
3490: 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d   || pVector->op=
34a0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
34b0: 20 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d      if( pVector-
34c0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 7c  >op==TK_SELECT |
34d0: 7c 20 70 56 65 63 74 6f 72 2d 3e 6f 70 32 3d 3d  | pVector->op2==
34e0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
34f0: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
3500: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
3510: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
3520: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3530: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
3540: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  r->x.pList->a[i]
3550: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20  .pExpr;.    }.  
3560: 7d 0a 20 20 72 65 74 75 72 6e 20 70 56 65 63 74  }.  return pVect
3570: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  or;.}../*.** Com
3580: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
3590: 61 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63  a new Expr objec
35a0: 74 20 77 68 69 63 68 20 77 68 65 6e 20 70 61 73  t which when pas
35b0: 73 65 64 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  sed to.** sqlite
35c0: 33 45 78 70 72 43 6f 64 65 28 29 20 77 69 6c 6c  3ExprCode() will
35d0: 20 67 65 6e 65 72 61 74 65 20 61 6c 6c 20 6e 65   generate all ne
35e0: 63 65 73 73 61 72 79 20 63 6f 64 65 20 74 6f 20  cessary code to 
35f0: 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 69  compute.** the i
3600: 46 69 65 6c 64 2d 74 68 20 63 6f 6c 75 6d 6e 20  Field-th column 
3610: 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 65 78  of the vector ex
3620: 70 72 65 73 73 69 6f 6e 20 70 56 65 63 74 6f 72  pression pVector
3630: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b  ..**.** It is ok
3640: 20 66 6f 72 20 70 56 65 63 74 6f 72 20 74 6f 20   for pVector to 
3650: 62 65 20 61 20 73 63 61 6c 61 72 20 28 61 73 20  be a scalar (as 
3660: 6c 6f 6e 67 20 61 73 20 69 46 69 65 6c 64 3d 3d  long as iField==
3670: 30 29 2e 20 20 0a 2a 2a 20 49 6e 20 74 68 61 74  0).  .** In that
3680: 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
3690: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 73  ine works like s
36a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2e  qlite3ExprDup().
36b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
36c0: 72 20 6f 77 6e 73 20 74 68 65 20 72 65 74 75 72  r owns the retur
36d0: 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20  ned Expr object 
36e0: 61 6e 64 20 69 73 20 72 65 73 70 6f 6e 73 69 62  and is responsib
36f0: 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e 73 75 72 69  le for.** ensuri
3700: 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ng that the retu
3710: 72 6e 65 64 20 76 61 6c 75 65 20 65 76 65 6e 74  rned value event
3720: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
3730: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
3740: 65 72 20 72 65 74 61 69 6e 73 20 6f 77 6e 65 72  er retains owner
3750: 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f 72 2e  ship of pVector.
3760: 20 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20    If pVector is 
3770: 61 20 54 4b 5f 53 45 4c 45 43 54 2c 0a 2a 2a 20  a TK_SELECT,.** 
3780: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
3790: 64 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 72 65  d object will re
37a0: 66 65 72 65 6e 63 65 20 70 56 65 63 74 6f 72 20  ference pVector 
37b0: 61 6e 64 20 73 6f 20 70 56 65 63 74 6f 72 20 6d  and so pVector m
37c0: 75 73 74 20 72 65 6d 61 69 6e 0a 2a 2a 20 76 61  ust remain.** va
37d0: 6c 69 64 20 66 6f 72 20 74 68 65 20 6c 69 66 65  lid for the life
37e0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
37f0: 20 6f 62 6a 65 63 74 2e 20 20 49 66 20 70 56 65   object.  If pVe
3800: 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 56 45 43  ctor is a TK_VEC
3810: 54 4f 52 0a 2a 2a 20 6f 72 20 61 20 73 63 61 6c  TOR.** or a scal
3820: 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  ar expression, t
3830: 68 65 6e 20 69 74 20 63 61 6e 20 62 65 20 64 65  hen it can be de
3840: 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73  leted as soon as
3850: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3860: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
3870: 41 20 74 72 69 63 6b 20 74 6f 20 63 61 75 73 65  A trick to cause
3880: 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 70 56 65   a TK_SELECT pVe
3890: 63 74 6f 72 20 74 6f 20 62 65 20 64 65 6c 65 74  ctor to be delet
38a0: 65 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  ed together with
38b0: 0a 2a 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64  .** the returned
38c0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 69 73 20   Expr object is 
38d0: 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 70 56  to attach the pV
38e0: 65 63 74 6f 72 20 74 6f 20 74 68 65 20 70 52 69  ector to the pRi
38f0: 67 68 74 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20  ght field.** of 
3900: 74 68 65 20 72 65 74 75 72 6e 65 64 20 54 4b 5f  the returned TK_
3910: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45 78  SELECT_COLUMN Ex
3920: 70 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 45 78  pr object..*/.Ex
3930: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
3940: 6f 72 56 65 63 74 6f 72 46 69 65 6c 64 28 0a 20  orVectorField(. 
3950: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3960: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3970: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3980: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 20 20 20  pr *pVector,    
3990: 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72     /* The vector
39a0: 2e 20 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65  .  List of expre
39b0: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 2d  ssions or a sub-
39c0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20  SELECT */.  int 
39d0: 69 46 69 65 6c 64 20 20 20 20 20 20 20 20 20 20  iField          
39e0: 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e   /* Which column
39f0: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 74   of the vector t
3a00: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20  o return */.){. 
3a10: 20 45 78 70 72 20 2a 70 52 65 74 3b 0a 20 20 69   Expr *pRet;.  i
3a20: 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d  f( pVector->op==
3a30: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
3a40: 20 61 73 73 65 72 74 28 20 70 56 65 63 74 6f 72   assert( pVector
3a50: 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20  ->eX==EX_Select 
3a60: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b  );.    /* The TK
3a70: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45  _SELECT_COLUMN E
3a80: 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a  xpr node:.    **
3a90: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20  .    ** pLeft:  
3aa0: 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72           pVector
3ab0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53   containing TK_S
3ac0: 45 4c 45 43 54 2e 20 20 4e 6f 74 20 64 65 6c 65  ELECT.  Not dele
3ad0: 74 65 64 2e 0a 20 20 20 20 2a 2a 20 70 52 69 67  ted..    ** pRig
3ae0: 68 74 3a 20 20 20 20 20 20 20 20 20 20 6e 6f 74  ht:          not
3af0: 20 75 73 65 64 2e 20 20 42 75 74 20 72 65 63 75   used.  But recu
3b00: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 64 2e  rsively deleted.
3b10: 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75 6d 6e 3a  .    ** iColumn:
3b20: 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 6f           Index o
3b30: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 56  f a column in pV
3b40: 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69 54 61  ector.    ** iTa
3b50: 62 6c 65 3a 20 20 20 20 20 20 20 20 20 20 30 20  ble:          0 
3b60: 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
3b70: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20   columns on the 
3b80: 4c 48 53 20 6f 66 20 61 6e 20 61 73 73 69 67 6e  LHS of an assign
3b90: 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 70 4c 65 66  ment.    ** pLef
3ba0: 74 2d 3e 69 54 61 62 6c 65 3a 20 20 20 46 69 72  t->iTable:   Fir
3bb0: 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
3bc0: 66 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  f register holdi
3bd0: 6e 67 20 72 65 73 75 6c 74 2c 20 6f 72 20 30 0a  ng result, or 0.
3be0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
3bf0: 20 20 20 20 20 20 20 20 69 66 20 74 68 65 20 72          if the r
3c00: 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 79 65 74  esult is not yet
3c10: 20 63 6f 6d 70 75 74 65 64 2e 0a 20 20 20 20 2a   computed..    *
3c20: 2a 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  *.    ** sqlite3
3c30: 45 78 70 72 44 65 6c 65 74 65 28 29 20 73 70 65  ExprDelete() spe
3c40: 63 69 66 69 63 61 6c 6c 79 20 73 6b 69 70 73 20  cifically skips 
3c50: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 64 65  the recursive de
3c60: 6c 65 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70  lete of.    ** p
3c70: 4c 65 66 74 20 6f 6e 20 54 4b 5f 53 45 4c 45 43  Left on TK_SELEC
3c80: 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 2e 20  T_COLUMN nodes. 
3c90: 20 42 75 74 20 70 52 69 67 68 74 20 69 73 20 66   But pRight is f
3ca0: 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20 70 56 65 63  ollowed, so pVec
3cb0: 74 6f 72 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62  tor.    ** can b
3cc0: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 70 52  e attached to pR
3cd0: 69 67 68 74 20 74 6f 20 63 61 75 73 65 20 74 68  ight to cause th
3ce0: 69 73 20 6e 6f 64 65 20 74 6f 20 74 61 6b 65 20  is node to take 
3cf0: 6f 77 6e 65 72 73 68 69 70 20 6f 66 0a 20 20 20  ownership of.   
3d00: 20 2a 2a 20 70 56 65 63 74 6f 72 2e 20 20 54 79   ** pVector.  Ty
3d10: 70 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69  pically there wi
3d20: 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 54  ll be multiple T
3d30: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
3d40: 6e 6f 64 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  nodes.    ** wit
3d50: 68 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74  h the same pLeft
3d60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3d70: 70 56 65 63 74 6f 72 2c 20 62 75 74 20 6f 6e 6c  pVector, but onl
3d80: 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 20 20  y one of them.  
3d90: 20 20 2a 2a 20 77 69 6c 6c 20 6f 77 6e 20 74 68    ** will own th
3da0: 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a  e pVector..    *
3db0: 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  /.    pRet = sql
3dc0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
3dd0: 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  , TK_SELECT_COLU
3de0: 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  MN, 0, 0);.    i
3df0: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
3e00: 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pRet->iColumn =
3e10: 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 70   iField;.      p
3e20: 52 65 74 2d 3e 70 4c 65 66 74 20 3d 20 70 56 65  Ret->pLeft = pVe
3e30: 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
3e40: 61 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20  assert( pRet==0 
3e50: 7c 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d  || pRet->iTable=
3e60: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
3e70: 20 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e     if( pVector->
3e80: 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20  op==TK_VECTOR ) 
3e90: 70 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f  pVector = pVecto
3ea0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46  r->x.pList->a[iF
3eb0: 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20  ield].pExpr;.   
3ec0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
3ed0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
3ee0: 62 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a  b, pVector, 0);.
3ef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3f00: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65  t;.}../*.** If e
3f10: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
3f20: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 53 45  is of type TK_SE
3f30: 4c 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63  LECT, generate c
3f40: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ode to evaluate.
3f50: 2a 2a 20 69 74 2e 20 52 65 74 75 72 6e 20 74 68  ** it. Return th
3f60: 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 77 68  e register in wh
3f70: 69 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69  ich the result i
3f80: 73 20 73 74 6f 72 65 64 20 28 6f 72 2c 20 69 66  s stored (or, if
3f90: 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c   the .** sub-sel
3fa0: 65 63 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  ect returns more
3fb0: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
3fc0: 2c 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  , the first in a
3fd0: 6e 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65  n array.** of re
3fe0: 67 69 73 74 65 72 73 20 69 6e 20 77 68 69 63 68  gisters in which
3ff0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4000: 74 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  tored)..**.** If
4010: 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20   pExpr is not a 
4020: 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73  TK_SELECT expres
4030: 73 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a  sion, return 0..
4040: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
4050: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
4060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
4070: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
4080: 6e 74 20 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e  nt reg = 0;.#ifn
4090: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
40a0: 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70  SUBQUERY.  if( p
40b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
40c0: 45 43 54 20 29 7b 0a 20 20 20 20 72 65 67 20 3d  ECT ){.    reg =
40d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
40e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
40f0: 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  xpr, 0, 0);.  }.
4100: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
4110: 72 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  reg;.}../*.** Ar
4120: 67 75 6d 65 6e 74 20 70 56 65 63 74 6f 72 20 70  gument pVector p
4130: 6f 69 6e 74 73 20 74 6f 20 61 20 76 65 63 74 6f  oints to a vecto
4140: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 2d 20 65  r expression - e
4150: 69 74 68 65 72 20 61 20 54 4b 5f 56 45 43 54 4f  ither a TK_VECTO
4160: 52 0a 2a 2a 20 6f 72 20 54 4b 5f 53 45 4c 45 43  R.** or TK_SELEC
4170: 54 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 6d  T that returns m
4180: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
4190: 75 6d 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  umn. This functi
41a0: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  on returns.** th
41b0: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
41c0: 72 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20  r of a register 
41d0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
41e0: 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 6c  e value of.** el
41f0: 65 6d 65 6e 74 20 69 46 69 65 6c 64 20 6f 66 20  ement iField of 
4200: 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  the vector..**.*
4210: 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 20  * If pVector is 
4220: 61 20 54 4b 5f 53 45 4c 45 43 54 20 65 78 70 72  a TK_SELECT expr
4230: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 63 6f 64  ession, then cod
4240: 65 20 66 6f 72 20 69 74 20 6d 75 73 74 20 68 61  e for it must ha
4250: 76 65 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62  ve .** already b
4260: 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 75 73  een generated us
4270: 69 6e 67 20 74 68 65 20 65 78 70 72 43 6f 64 65  ing the exprCode
4280: 53 75 62 73 65 6c 65 63 74 28 29 20 72 6f 75 74  Subselect() rout
4290: 69 6e 65 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  ine. In this.** 
42a0: 63 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 72  case parameter r
42b0: 65 67 53 65 6c 65 63 74 20 73 68 6f 75 6c 64 20  egSelect should 
42c0: 62 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  be the first in 
42d0: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
42e0: 73 74 65 72 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  sters.** contain
42f0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
4300: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
4310: 74 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56 65  t. .**.** If pVe
4320: 63 74 6f 72 20 69 73 20 6f 66 20 74 79 70 65 20  ctor is of type 
4330: 54 4b 5f 56 45 43 54 4f 52 2c 20 74 68 65 6e 20  TK_VECTOR, then 
4340: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 72 65 71  code for the req
4350: 75 65 73 74 65 64 20 66 69 65 6c 64 0a 2a 2a 20  uested field.** 
4360: 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 49 6e  is generated. In
4370: 20 74 68 69 73 20 63 61 73 65 20 28 2a 70 52 65   this case (*pRe
4380: 67 46 72 65 65 29 20 6d 61 79 20 62 65 20 73 65  gFree) may be se
4390: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
43a0: 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
43b0: 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62 65  y register to be
43c0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
43d0: 6c 6c 65 72 20 62 65 66 6f 72 65 20 72 65 74 75  ller before retu
43e0: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  rning..**.** Bef
43f0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 6f  ore returning, o
4400: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20  utput parameter 
4410: 28 2a 70 70 45 78 70 72 29 20 69 73 20 73 65 74  (*ppExpr) is set
4420: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
4430: 0a 2a 2a 20 45 78 70 72 20 6f 62 6a 65 63 74 20  .** Expr object 
4440: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
4450: 20 65 6c 65 6d 65 6e 74 20 69 45 6c 65 6d 20 6f   element iElem o
4460: 66 20 74 68 65 20 76 65 63 74 6f 72 2e 0a 2a 2f  f the vector..*/
4470: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
4480: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 0a  VectorRegister(.
4490: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
44c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56  xt */.  Expr *pV
44d0: 65 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20  ector,          
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63 74 6f          /* Vecto
44f0: 72 20 74 6f 20 65 78 74 72 61 63 74 20 65 6c 65  r to extract ele
4500: 6d 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ment from */.  i
4510: 6e 74 20 69 46 69 65 6c 64 2c 20 20 20 20 20 20  nt iField,      
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4530: 2a 20 46 69 65 6c 64 20 74 6f 20 65 78 74 72 61  * Field to extra
4540: 63 74 20 66 72 6f 6d 20 70 56 65 63 74 6f 72 20  ct from pVector 
4550: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 65 6c 65  */.  int regSele
4560: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
4570: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
4580: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
4590: 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ers */.  Expr **
45a0: 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  ppExpr,         
45b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
45c0: 20 45 78 70 72 65 73 73 69 6f 6e 20 65 6c 65 6d   Expression elem
45d0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ent */.  int *pR
45e0: 65 67 46 72 65 65 20 20 20 20 20 20 20 20 20 20  egFree          
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4600: 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74   Temp register t
4610: 6f 20 66 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 75  o free */.){.  u
4620: 38 20 6f 70 20 3d 20 70 56 65 63 74 6f 72 2d 3e  8 op = pVector->
4630: 6f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  op;.  assert( op
4640: 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 6f  ==TK_VECTOR || o
4650: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c  p==TK_REGISTER |
4660: 7c 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  | op==TK_SELECT 
4670: 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
4680: 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
4690: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
46a0: 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
46b0: 78 70 72 28 70 56 65 63 74 6f 72 2c 20 69 46 69  xpr(pVector, iFi
46c0: 65 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eld);.    return
46d0: 20 70 56 65 63 74 6f 72 2d 3e 69 54 61 62 6c 65   pVector->iTable
46e0: 2b 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 69  +iField;.  }.  i
46f0: 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  f( op==TK_SELECT
4700: 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72 20   ){.    *ppExpr 
4710: 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65  = pVector->x.pSe
4720: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
4730: 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20  iField].pExpr;. 
4740: 20 20 20 20 72 65 74 75 72 6e 20 72 65 67 53 65      return regSe
4750: 6c 65 63 74 2b 69 46 69 65 6c 64 3b 0a 20 20 7d  lect+iField;.  }
4760: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65  .  *ppExpr = pVe
4770: 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ctor->x.pList->a
4780: 5b 69 46 69 65 6c 64 5d 2e 70 45 78 70 72 3b 0a  [iField].pExpr;.
4790: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
47a0: 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
47b0: 72 73 65 2c 20 2a 70 70 45 78 70 72 2c 20 70 52  rse, *ppExpr, pR
47c0: 65 67 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  egFree);.}../*.*
47d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * Expression pEx
47e0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
47f0: 6f 6e 20 62 65 74 77 65 65 6e 20 74 77 6f 20 76  on between two v
4800: 65 63 74 6f 72 20 76 61 6c 75 65 73 2e 20 43 6f  ector values. Co
4810: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 72 65 73  mpute.** the res
4820: 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ult of the compa
4830: 72 69 73 6f 6e 20 28 31 2c 20 30 2c 20 6f 72 20  rison (1, 0, or 
4840: 4e 55 4c 4c 29 20 61 6e 64 20 77 72 69 74 65 20  NULL) and write 
4850: 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69  that.** result i
4860: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 64 65 73  nto register des
4870: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  t..**.** The cal
4880: 6c 65 72 20 6d 75 73 74 20 73 61 74 69 73 66 79  ler must satisfy
4890: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
48a0: 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a 2a 2a  reconditions:.**
48b0: 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d  .**    if pExpr-
48c0: 3e 6f 70 3d 3d 54 4b 5f 49 53 3a 20 20 20 20 20  >op==TK_IS:     
48d0: 20 6f 70 3d 3d 54 4b 5f 45 51 20 61 6e 64 20 70   op==TK_EQ and p
48e0: 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  5==SQLITE_NULLEQ
48f0: 0a 2a 2a 20 20 20 20 69 66 20 70 45 78 70 72 2d  .**    if pExpr-
4900: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 3a 20 20  >op==TK_ISNOT:  
4910: 20 6f 70 3d 3d 54 4b 5f 4e 45 20 61 6e 64 20 70   op==TK_NE and p
4920: 35 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  5==SQLITE_NULLEQ
4930: 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65  .**    otherwise
4940: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
4950: 20 6f 70 3d 3d 70 45 78 70 72 2d 3e 6f 70 20 61   op==pExpr->op a
4960: 6e 64 20 70 35 3d 3d 30 0a 2a 2f 0a 73 74 61 74  nd p5==0.*/.stat
4970: 69 63 20 76 6f 69 64 20 63 6f 64 65 56 65 63 74  ic void codeVect
4980: 6f 72 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  orCompare(.  Par
4990: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
49a0: 20 20 20 2f 2a 20 43 6f 64 65 20 67 65 6e 65 72     /* Code gener
49b0: 61 74 6f 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ator context */.
49c0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
49d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
49e0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
49f0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
4a00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
4a10: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20  * Write results 
4a20: 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
4a30: 65 72 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20  er */.  u8 op,  
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a50: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   Comparison oper
4a60: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 70 35 20  ator */.  u8 p5 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 2f 2a 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  /* SQLITE_NULLEQ
4a90: 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 29 7b 0a 20   or zero */.){. 
4aa0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4ab0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72  e->pVdbe;.  Expr
4ac0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
4ad0: 3e 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 20 2a  >pLeft;.  Expr *
4ae0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
4af0: 78 2e 70 52 69 67 68 74 3b 0a 20 20 69 6e 74 20  x.pRight;.  int 
4b00: 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  nLeft = sqlite3E
4b10: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
4b20: 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  eft);.  int i;. 
4b30: 20 69 6e 74 20 72 65 67 4c 65 66 74 20 3d 20 30   int regLeft = 0
4b40: 3b 0a 20 20 69 6e 74 20 72 65 67 52 69 67 68 74  ;.  int regRight
4b50: 20 3d 20 30 3b 0a 20 20 75 38 20 6f 70 78 20 3d   = 0;.  u8 opx =
4b60: 20 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 44   op;.  int addrD
4b70: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
4b80: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
4b90: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 73 71 6c    if( nLeft!=sql
4ba0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
4bb0: 7a 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  ze(pRight) ){.  
4bc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4bd0: 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76  g(pParse, "row v
4be0: 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a  alue misused");.
4bf0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4c00: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4c10: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45  >op==TK_EQ || pE
4c20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 0a  xpr->op==TK_NE .
4c30: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
4c40: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70 45  >op==TK_IS || pE
4c50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
4c60: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4c70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
4c80: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4c90: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  T .       || pEx
4ca0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
4cb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
4cc0: 45 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  E .  );.  assert
4cd0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20  ( pExpr->op==op 
4ce0: 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  || (pExpr->op==T
4cf0: 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45  K_IS && op==TK_E
4d00: 51 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  Q).            |
4d10: 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  | (pExpr->op==TK
4d20: 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b  _ISNOT && op==TK
4d30: 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  _NE) );.  assert
4d40: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4d50: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 61 73  ->op!=op );.  as
4d60: 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49 54 45  sert( p5==SQLITE
4d70: 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78 70 72  _NULLEQ || pExpr
4d80: 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20 20 70  ->op==op );..  p
4d90: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53 54 4f 52  5 |= SQLITE_STOR
4da0: 45 50 32 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  EP2;.  if( opx==
4db0: 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_LE ) opx = TK
4dc0: 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70 78 3d 3d  _LT;.  if( opx==
4dd0: 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d 20 54 4b  TK_GE ) opx = TK
4de0: 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65 66 74 20  _GT;..  regLeft 
4df0: 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  = exprCodeSubsel
4e00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
4e10: 74 29 3b 0a 20 20 72 65 67 52 69 67 68 74 20 3d  t);.  regRight =
4e20: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4e30: 63 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  ct(pParse, pRigh
4e40: 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t);..  for(i=0; 
4e50: 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74 73 20 62  1 /*Loop exits b
4e60: 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20 69 2b 2b  y "break"*/; i++
4e70: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 72  ){.    int regFr
4e80: 65 65 31 20 3d 20 30 2c 20 72 65 67 46 72 65 65  ee1 = 0, regFree
4e90: 32 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 20  2 = 0;.    Expr 
4ea0: 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 69  *pL, *pR; .    i
4eb0: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 61  nt r1, r2;.    a
4ec0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
4ed0: 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20 20 72 31  <nLeft );.    r1
4ee0: 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67   = exprVectorReg
4ef0: 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c  ister(pParse, pL
4f00: 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c  eft, i, regLeft,
4f10: 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29   &pL, &regFree1)
4f20: 3b 0a 20 20 20 20 72 32 20 3d 20 65 78 70 72 56  ;.    r2 = exprV
4f30: 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70 50  ectorRegister(pP
4f40: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69 2c  arse, pRight, i,
4f50: 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c 20   regRight, &pR, 
4f60: 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
4f70: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
4f80: 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f 70 78 2c  se, pL, pR, opx,
4f90: 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 70   r1, r2, dest, p
4fa0: 35 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  5);.    testcase
4fb0: 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
4fc0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4fd0: 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65  ==OP_Lt);.    te
4fe0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
4ff0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
5000: 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
5010: 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d      testcase(op=
5020: 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
5030: 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
5040: 5f 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61  _Gt);.    testca
5050: 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
5060: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5070: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
5080: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
5090: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
50a0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
50b0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f  ;.    testcase(o
50c0: 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
50d0: 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
50e0: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69  OP_Ne);.    sqli
50f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5100: 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
5110: 65 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e1);.    sqlite3
5120: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5130: 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
5140: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65  ;.    if( i==nLe
5150: 66 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72  ft-1 ){.      br
5160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
5170: 66 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b  f( opx==TK_EQ ){
5180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
51a0: 66 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72  fNot, dest, addr
51b0: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
51c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35  age(v);.      p5
51d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e   |= SQLITE_KEEPN
51e0: 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
51f0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
5200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5210: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5220: 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  f, dest, addrDon
5230: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
5240: 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d  (v);.      p5 |=
5250: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
5260: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5270: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
5280: 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47  K_LT || op==TK_G
5290: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  T || op==TK_LE |
52a0: 7c 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  | op==TK_GE );. 
52b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
52c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73  AddOp2(v, OP_Els
52d0: 65 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44  eNotEq, 0, addrD
52e0: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  one);.      Vdbe
52f0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
5300: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
5310: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
5320: 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20  , op==TK_GT);.  
5330: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5340: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
5350: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5360: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
5370: 5f 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _GE);.      if( 
5380: 69 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78  i==nLeft-2 ) opx
5390: 20 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   = op;.    }.  }
53a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
53b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
53c0: 64 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20  drDone);.}..#if 
53d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
53e0: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
53f0: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
5400: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
5410: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5420: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
5430: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
5440: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
5450: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
5460: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5470: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
5480: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5490: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
54a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
54b0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
54c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
54d0: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
54e0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
54f0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5500: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
5510: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
5520: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
5530: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5540: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
5550: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
5560: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
5570: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
5580: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
5590: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
55a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
55b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
55c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
55d0: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
55e0: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
55f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
5600: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
5610: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
5620: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
5630: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5640: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
5650: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5660: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
5670: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
5680: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
5690: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
56a0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
56b0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
56c0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
56d0: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
56e0: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
56f0: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
5700: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
5710: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
5720: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
5730: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
5740: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
5750: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
5760: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
5770: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
5780: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
5790: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
57a0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
57b0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
57c0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
57d0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
57e0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
57f0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5800: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5810: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
5820: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
5830: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
5840: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
5850: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
5860: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
5870: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
5880: 20 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a   *pSelect, int *
5890: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c  pnHeight){.  Sel
58a0: 65 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  ect *p;.  for(p=
58b0: 70 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d  pSelect; p; p=p-
58c0: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65  >pPrior){.    he
58d0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
58e0: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
58f0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5900: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5910: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5920: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5930: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5940: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5950: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
5960: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5970: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5980: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
5990: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
59a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
59b0: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
59c0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
59d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
59e0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
59f0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5a00: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5a10: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5a20: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5a30: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5a40: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
5a50: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
5a60: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
5a70: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
5a80: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
5a90: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
5aa0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
5ab0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
5ac0: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
5ad0: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5ae0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70  .**.** Also prop
5af0: 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61  agate EP_Propaga
5b00: 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d  te flags up from
5b10: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f   Expr.x.pList to
5b20: 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20   Expr.flags,.** 
5b30: 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
5b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5b50: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
5b60: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
5b70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
5b80: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
5b90: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5ba0: 73 77 69 74 63 68 28 20 70 2d 3e 65 58 20 29 7b  switch( p->eX ){
5bb0: 0a 20 20 20 20 63 61 73 65 20 45 58 5f 53 65 6c  .    case EX_Sel
5bc0: 65 63 74 3a 20 7b 0a 20 20 20 20 20 20 68 65 69  ect: {.      hei
5bd0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78  ghtOfSelect(p->x
5be0: 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  .pSelect, &nHeig
5bf0: 68 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ht);.      break
5c00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5c10: 20 45 58 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20   EX_List: {.    
5c20: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5c30: 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  st(p->x.pList, &
5c40: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20  nHeight);.      
5c50: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
5c60: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
5c70: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
5c80: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  p->x.pList);.   
5c90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5ca0: 20 20 20 20 63 61 73 65 20 45 58 5f 52 69 67 68      case EX_Righ
5cb0: 74 3a 20 7b 0a 20 20 20 20 20 20 68 65 69 67 68  t: {.      heigh
5cc0: 74 4f 66 45 78 70 72 28 70 2d 3e 78 2e 70 52 69  tOfExpr(p->x.pRi
5cd0: 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ght, &nHeight);.
5ce0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5cf0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69   }.  }.  p->nHei
5d00: 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20  ght = nHeight + 
5d10: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
5d20: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
5d30: 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20   variable using 
5d40: 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68  the exprSetHeigh
5d50: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  t() function. If
5d60: 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69  .** the height i
5d70: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5d80: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
5d90: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ed expression de
5da0: 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  pth,.** leave an
5db0: 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
5dc0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
5dd0: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
5de0: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
5df0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
5e00: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
5e10: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
5e20: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
5e30: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
5e40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5e50: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5e60: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
5e70: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78  r ) return;.  ex
5e80: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
5e90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
5ea0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
5eb0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
5ec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5ed0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5ee0: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
5ef0: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
5f00: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
5f10: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
5f20: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
5f30: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
5f40: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
5f50: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
5f60: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
5f70: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
5f80: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
5f90: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
5fa0: 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41  ht;.}.#else /* A
5fb0: 42 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e  BOVE:  Height en
5fc0: 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65  forcement enable
5fd0: 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68  d.  BELOW: Heigh
5fe0: 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66  t enforcement of
5ff0: 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61  f */./*.** Propa
6000: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
6010: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
6020: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
6030: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
6040: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
6050: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
6060: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
6070: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
6080: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20  *p){.  if( p && 
6090: 70 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29  p->eX==EX_List )
60a0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
60b0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
60c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
60d0: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
60e0: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
60f0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
6100: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
6110: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
6120: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
6130: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
6140: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
6150: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
6160: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
6170: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
6180: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
6190: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
61a0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
61b0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
61c0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
61d0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
61e0: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
61f0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
6200: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
6210: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
6220: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
6230: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
6240: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
6250: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
6260: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
6270: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
6280: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
6290: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
62a0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
62b0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
62c0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
62d0: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
62e0: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
62f0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
6300: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
6310: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
6320: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
6330: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
6340: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
6350: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
6360: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
6370: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
6380: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
6390: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
63a0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
63b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
63c0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
63d0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
63e0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
63f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
6400: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
6410: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
6420: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
6430: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
6440: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
6450: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
6460: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
6470: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
6480: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6490: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
64a0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
64b0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
64c0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
64d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
64e0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
64f0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
6500: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
6510: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
6520: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6530: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6550: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
6560: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 29  3DbMallocRawNN()
6570: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6590: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
65a0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
65b0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
65c0: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
65d0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
65e0: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
65f0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
6600: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
6610: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
6620: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
6630: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
6640: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
6650: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
6660: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
6670: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
6680: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
6690: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
66a0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
66b0: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
66c0: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
66d0: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
66e0: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
66f0: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
6700: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
6710: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
6720: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
6730: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
6740: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
6750: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
6760: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
6770: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
6780: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
6790: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
67a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
67b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
67c0: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
67d0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
67e0: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
67f0: 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 70  _Leaf;.        p
6800: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
6810: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
6820: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6830: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
6840: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
6850: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6860: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
6870: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
6880: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
6890: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
68a0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
68b0: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
68c0: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
68d0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
68e0: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
68f0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
6900: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
6910: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
6920: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
6930: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
6940: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
6950: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
6960: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6980: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6990: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
69a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
69b0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
69c0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
69d0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
69e0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
69f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6a00: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6a10: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
6a20: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
6a30: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
6a40: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
6a50: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
6a60: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6a70: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6a80: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6a90: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6aa0: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6ab0: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6ac0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6ad0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6ae0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6af0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6b00: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6b10: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
6b20: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
6b30: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
6b40: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
6b50: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
6b60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6b70: 28 7a 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (zToken);.  retu
6b80: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
6b90: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
6ba0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
6bb0: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
6bc0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
6bd0: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
6be0: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
6bf0: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
6c00: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
6c10: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
6c20: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
6c30: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
6c40: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
6c50: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
6c60: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
6c70: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
6c80: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
6c90: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
6ca0: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
6cb0: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
6cc0: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
6cd0: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
6ce0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
6cf0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6d00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6d10: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
6d20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6d30: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
6d40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6d50: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
6d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
6d70: 74 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20 29  t->eX==EX_None )
6d80: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 78  ;.      pRoot->x
6d90: 2e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  .pRight = pRight
6da0: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 65  ;.      pRoot->e
6db0: 58 20 3d 20 45 58 5f 52 69 67 68 74 3b 0a 20 20  X = EX_Right;.  
6dc0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
6dd0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
6de0: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
6df0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e00: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
6e10: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
6e20: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
6e30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
6e40: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
6e50: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
6e60: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
6e70: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
6e80: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6e90: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
6ea0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
6eb0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
6ec0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
6ed0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
6ee0: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
6ef0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6f00: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
6f10: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
6f20: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
6f30: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
6f40: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6f50: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
6f60: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
6f70: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
6f80: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
6f90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6fa0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
6fb0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
6fc0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6fe0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
6ff0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
7000: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
7010: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
7020: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
7030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
7040: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 29  ght operand */.)
7050: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
7060: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
7070: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
7080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
7090: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
70a0: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
70b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
70c0: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
70d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
70e0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
70f0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
7100: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
7110: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
7120: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
7130: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
7140: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
7150: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
7160: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
7170: 20 20 70 2d 3e 6f 70 20 3d 20 6f 70 20 26 20 54    p->op = op & T
7180: 4b 46 4c 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 20  KFLG_MASK;.     
7190: 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20   p->iAgg = -1;. 
71a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
71b0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
71c0: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
71d0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
71e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
71f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7200: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
7210: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
7220: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70  ;.}../*.** Add p
7240: 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78  Select to the Ex
7250: 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65  pr.x.pSelect fie
7260: 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70  ld.  Or, if pExp
7270: 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a  r is NULL (due.*
7280: 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * do a memory al
7290: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
72a0: 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  ) then delete th
72b0: 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  e pSelect object
72c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72d0: 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28  3PExprAddSelect(
72e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
72f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65  xpr *pExpr, Sele
7300: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
7310: 69 66 28 20 70 45 78 70 72 20 26 26 20 70 53 65  if( pExpr && pSe
7320: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  lect ){.    asse
7330: 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45  rt( pExpr->eX==E
7340: 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 70 45  X_None );.    pE
7350: 78 70 72 2d 3e 65 58 20 3d 20 45 58 5f 53 65 6c  xpr->eX = EX_Sel
7360: 65 63 74 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ect;.    pExpr->
7370: 78 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  x.pSelect = pSel
7380: 65 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ect;.    ExprSet
7390: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
73a0: 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20  EP_Subquery);.  
73b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
73c0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70  HeightAndFlags(p
73d0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
73e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
73f0: 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
7400: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7410: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
7420: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
7430: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
7440: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 45  }.}../*.** Add E
7450: 78 70 72 4c 69 73 74 20 74 6f 20 74 68 65 20 45  xprList to the E
7460: 78 70 72 2e 78 2e 70 4c 69 73 74 20 66 69 65 6c  xpr.x.pList fiel
7470: 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72  d.  Or, if pExpr
7480: 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a   is NULL (due.**
7490: 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   do a memory all
74a0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29  ocation failure)
74b0: 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
74c0: 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e   pSelect object.
74d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
74e0: 50 45 78 70 72 41 64 64 45 78 70 72 4c 69 73 74  PExprAddExprList
74f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7500: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 45 78 70  Expr *pExpr, Exp
7510: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
7520: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 4c   if( pExpr && pL
7530: 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
7540: 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  t( pExpr->eX==EX
7550: 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 70 45 78  _None );.    pEx
7560: 70 72 2d 3e 65 58 20 3d 20 45 58 5f 4c 69 73 74  pr->eX = EX_List
7570: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70  ;.    pExpr->x.p
7580: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
7590: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
75a0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
75b0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  s(pParse, pExpr)
75c0: 3b 20 2f 2f 20 64 6f 6e 65 20 62 79 20 63 61 6c  ; // done by cal
75d0: 6c 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ler */.  }else{.
75e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
75f0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
7600: 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69  iled );.    sqli
7610: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7620: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
7630: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  ist);.  }.}.../*
7640: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
7650: 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ssion is always 
7660: 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46  either TRUE or F
7670: 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65  ALSE (respective
7680: 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ly),.** then ret
7690: 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63  urn 1.  If one c
76a0: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
76b0: 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20  the truth value 
76c0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
76d0: 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  sion at compile-
76e0: 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  time return 0..*
76f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
7700: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
7710: 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72  f is OK to retur
7720: 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66  n 0 here even if
7730: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
7740: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
7750: 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c  ays false or fal
7760: 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61  se (a false nega
7770: 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74  tive)..** But it
7780: 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74   is a bug to ret
7790: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
77a0: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61  ression might ha
77b0: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
77c0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69  boolean values i
77d0: 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63  n different circ
77e0: 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c  umstances (a fal
77f0: 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a  se positive.).**
7800: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
7810: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7820: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69  is part of condi
7830: 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20  tional for a.** 
7840: 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
7850: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
7860: 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ine at compile-t
7870: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
7880: 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65  ot.** is it true
7890: 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c   or false, so al
78a0: 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ways return 0..*
78b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
78c0: 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72  rAlwaysTrue(Expr
78d0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
78e0: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
78f0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
7900: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
7910: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
7920: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
7930: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
7940: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d   0;.  return v!=
7950: 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  0;.}.static int 
7960: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
7970: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
7980: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
7990: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
79a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
79b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
79c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
79d0: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
79e0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
79f0: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
7a00: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
7a10: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
7a20: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
7a30: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
7a40: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
7a50: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
7a60: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
7a70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
7a80: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
7a90: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
7aa0: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
7ab0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
7ac0: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
7ad0: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
7ae0: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
7af0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
7b00: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
7b10: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
7b20: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
7b30: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
7b40: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
7b50: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
7b60: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
7b70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
7b80: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
7b90: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
7ba0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
7bb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
7bc0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
7bd0: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
7be0: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
7bf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7c00: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
7c10: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
7c20: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7c30: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
7c40: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
7c50: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
7c60: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
7c70: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
7c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
7c90: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
7ca0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
7cb0: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
7cc0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
7cd0: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
7ce0: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
7cf0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
7d00: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
7d10: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
7d20: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
7d30: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
7d40: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
7d50: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
7d60: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7d70: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
7d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7d90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7da0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7db0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7dc0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
7dd0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
7de0: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
7df0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
7e00: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
7e10: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
7e20: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
7e30: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
7e40: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
7e50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7e60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7e70: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7e80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7e90: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7ea0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
7eb0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
7ec0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
7ed0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7ee0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7ef0: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7f00: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7f10: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7f20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7f30: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
7f40: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
7f50: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
7f60: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
7f70: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
7f80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7f90: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7fa0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
7fb0: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
7fc0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
7fd0: 74 28 20 70 4e 65 77 2d 3e 65 58 3d 3d 45 58 5f  t( pNew->eX==EX_
7fe0: 4e 6f 6e 65 20 29 3b 0a 20 20 69 66 28 20 70 4c  None );.  if( pL
7ff0: 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ist ){.    pNew-
8000: 3e 65 58 20 3d 20 45 58 5f 4c 69 73 74 3b 0a 20  >eX = EX_List;. 
8010: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
8020: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 0a 20 20   = pList;.  }.  
8030: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
8040: 70 4e 65 77 2c 20 45 50 5f 48 61 73 46 75 6e 63  pNew, EP_HasFunc
8050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
8060: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
8070: 73 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b  s(pParse, pNew);
8080: 0a 20 20 69 66 28 20 65 44 69 73 74 69 6e 63 74  .  if( eDistinct
8090: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  ==SF_Distinct ) 
80a0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
80b0: 70 4e 65 77 2c 20 45 50 5f 44 69 73 74 69 6e 63  pNew, EP_Distinc
80c0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
80d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
80e0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
80f0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
8100: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
8110: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
8120: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
8130: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
8140: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
8150: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
8160: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
8170: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
8180: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
8190: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
81a0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
81b0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
81c0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
81d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
81e0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
81f0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
8200: 74 20 74 6f 6f 20 62 69 67 20 74 6f 20 61 76 6f  t too big to avo
8210: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
8220: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
8230: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
8240: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
8250: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
8260: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
8270: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
8280: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
8290: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
82a0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
82b0: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
82c0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
82d0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
82e0: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
82f0: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
8300: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
8310: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
8320: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
8330: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
8340: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
8350: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
8360: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
8370: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
8380: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
8390: 78 70 72 2c 20 75 33 32 20 6e 29 7b 0a 20 20 73  xpr, u32 n){.  s
83a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
83b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
83c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 79 6e 56 61   char *z;.  ynVa
83d0: 72 20 78 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r x;..  if( pExp
83e0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
83f0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8400: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
8410: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
8420: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
8430: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
8440: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
8450: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
8460: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
8470: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8480: 20 6e 3d 3d 28 75 33 32 29 73 71 6c 69 74 65 33   n==(u32)sqlite3
8490: 53 74 72 6c 65 6e 33 30 28 7a 29 20 29 3b 0a 20  Strlen30(z) );. 
84a0: 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a   if( z[1]==0 ){.
84b0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
84c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e  of the form "?".
84d0: 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78    Assign the nex
84e0: 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  t variable numbe
84f0: 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
8500: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20   z[0]=='?' );.  
8510: 20 20 78 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b    x = (ynVar)(++
8520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
8530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
8540: 64 6f 41 64 64 20 3d 20 30 3b 0a 20 20 20 20 69  doAdd = 0;.    i
8550: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
8560: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8570: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
8580: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
8590: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
85a0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
85b0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
85c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
85d0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
85e0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 0a 20 20 20      int bOk;.   
85f0: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 20 2f     if( n==2 ){ /
8600: 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46  *OPTIMIZATION-IF
8610: 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20 20 20 20  -TRUE*/.        
8620: 69 20 3d 20 7a 5b 31 5d 2d 27 30 27 3b 20 20 2f  i = z[1]-'0';  /
8630: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
8640: 65 20 6f 66 20 3f 4e 20 66 6f 72 20 61 20 73 69  e of ?N for a si
8650: 6e 67 6c 65 20 64 69 67 69 74 20 4e 20 2a 2f 0a  ngle digit N */.
8660: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
8670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8680: 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3d 3d 73        bOk = 0==s
8690: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
86a0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
86b0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
86c0: 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
86d0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
86e0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
86f0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8700: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
8710: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8720: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
8730: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8740: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
8750: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
8760: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
8770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
8780: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
8790: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
87a0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
87b0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
87c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
87d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
87e0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
87f0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
8800: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
8810: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
8820: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8830: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
8840: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
8850: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 78  .      }.      x
8860: 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20   = (ynVar)i;.   
8870: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
8880: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
8890: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
88a0: 28 69 6e 74 29 78 3b 0a 20 20 20 20 20 20 20 20  (int)x;.        
88b0: 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20 20 20  doAdd = 1;.     
88c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
88d0: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
88e0: 28 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c  (pParse->pVList,
88f0: 20 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   x)==0 ){.      
8900: 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20 20    doAdd = 1;.   
8910: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8920: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
8930: 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20  ds like ":aaa", 
8940: 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61 22  "$aaa" or "@aaa"
8950: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
8960: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  e variable.     
8970: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
8980: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
8990: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
89a0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
89b0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ame.      ** has
89c0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
89d0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
89e0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
89f0: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a  number.      */.
8a00: 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72        x = (ynVar
8a10: 29 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 61 6d  )sqlite3VListNam
8a20: 65 54 6f 4e 75 6d 28 70 50 61 72 73 65 2d 3e 70  eToNum(pParse->p
8a30: 56 4c 69 73 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20  VList, z, n);.  
8a40: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a      if( x==0 ){.
8a50: 20 20 20 20 20 20 20 20 78 20 3d 20 28 79 6e 56          x = (ynV
8a60: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
8a70: 61 72 29 3b 0a 20 20 20 20 20 20 20 20 64 6f 41  ar);.        doA
8a80: 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dd = 1;.      }.
8a90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
8aa0: 41 64 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Add ){.      pPa
8ab0: 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 73 71  rse->pVList = sq
8ac0: 6c 69 74 65 33 56 4c 69 73 74 41 64 64 28 64 62  lite3VListAdd(db
8ad0: 2c 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  , pParse->pVList
8ae0: 2c 20 7a 2c 20 6e 2c 20 78 29 3b 0a 20 20 20 20  , z, n, x);.    
8af0: 7d 0a 20 20 7d 0a 20 20 70 45 78 70 72 2d 3e 69  }.  }.  pExpr->i
8b00: 43 6f 6c 75 6d 6e 20 3d 20 78 3b 0a 20 20 69 66  Column = x;.  if
8b10: 28 20 78 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ( x>db->aLimit[S
8b20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
8b30: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
8b40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8b50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8b60: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
8b70: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
8b80: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
8b90: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
8ba0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
8bb0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
8bc0: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
8bd0: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
8be0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8bf0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
8c00: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
8c10: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
8c20: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
8c30: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
8c40: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
8c50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
8c60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8c70: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
8c80: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
8c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8ca0: 65 58 21 3d 45 58 5f 53 65 6c 65 63 74 20 7c 7c  eX!=EX_Select ||
8cb0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 21 3d 30   p->x.pSelect!=0
8cc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8cd0: 3e 65 58 21 3d 45 58 5f 4c 69 73 74 20 7c 7c 20  >eX!=EX_List || 
8ce0: 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 3b  p->x.pList!=0 );
8cf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8d00: 45 42 55 47 0a 20 20 69 66 28 20 45 78 70 72 48  EBUG.  if( ExprH
8d10: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8d20: 5f 4c 65 61 66 29 20 26 26 20 21 45 78 70 72 48  _Leaf) && !ExprH
8d30: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8d40: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
8d50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
8d60: 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  eft==0 );.    as
8d70: 73 65 72 74 28 20 70 2d 3e 65 58 3d 3d 45 58 5f  sert( p->eX==EX_
8d80: 4e 6f 6e 65 20 7c 7c 20 70 2d 3e 65 58 3d 3d 45  None || p->eX==E
8d90: 58 5f 54 61 62 20 29 3b 0a 20 20 7d 0a 20 20 69  X_Tab );.  }.  i
8da0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8db0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
8dc0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 61 73 73 65  nly) ){.    asse
8dd0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 55  rt( p->op!=TK_FU
8de0: 4e 43 54 49 4f 4e 20 7c 7c 20 70 2d 3e 70 4c 65  NCTION || p->pLe
8df0: 66 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  ft==0 );.  }.  i
8e00: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
8e10: 72 74 79 28 70 2c 20 28 45 50 5f 54 6f 6b 65 6e  rty(p, (EP_Token
8e20: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
8e30: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
8e40: 20 70 2d 3e 70 57 69 6e 3d 3d 30 20 7c 7c 20 70   p->pWin==0 || p
8e50: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
8e60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 57 69    assert( p->pWi
8e70: 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  n==0 || p->op==T
8e80: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  K_FUNCTION );.  
8e90: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  }.#endif.  if( !
8ea0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8eb0: 70 2c 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  p, (EP_TokenOnly
8ec0: 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a 20 20  |EP_Leaf)) ){.  
8ed0: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
8ee0: 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45  & p->op!=TK_SELE
8ef0: 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69  CT_COLUMN ) sqli
8f00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28  te3ExprDeleteNN(
8f10: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
8f20: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 58     switch( p->eX
8f30: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45   ){.      case E
8f40: 58 5f 53 65 6c 65 63 74 3a 20 7b 0a 20 20 20 20  X_Select: {.    
8f50: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8f60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8f70: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
8f80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f90: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 5f  }.      case EX_
8fa0: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  List: {.        
8fb0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8fc0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
8fd0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62  List);.        b
8fe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8ff0: 20 20 20 20 63 61 73 65 20 45 58 5f 52 69 67 68      case EX_Righ
9000: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t: {.        sql
9010: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9020: 62 2c 20 70 2d 3e 78 2e 70 52 69 67 68 74 29 3b  b, p->x.pRight);
9030: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9040: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9050: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
9060: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
9070: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 73  uced) ){.      s
9080: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
9090: 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 6e 29 3b  te(db, p->pWin);
90a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
90b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
90c0: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
90d0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
90e0: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
90f0: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
9100: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9110: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
9120: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
9130: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  b, p);.  }.}.voi
9140: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
9150: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
9160: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
9170: 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72   p ) sqlite3Expr
9180: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b  DeleteNN(db, p);
9190: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
91a0: 45 78 70 72 43 6c 65 61 72 58 55 6e 69 6f 6e 28  ExprClearXUnion(
91b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
91c0: 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28  r *p){.  switch(
91d0: 20 70 2d 3e 65 58 20 29 7b 0a 20 20 20 20 63 61   p->eX ){.    ca
91e0: 73 65 20 45 58 5f 53 65 6c 65 63 74 3a 20 7b 0a  se EX_Select: {.
91f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
9200: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
9210: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
9220: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9230: 20 20 20 20 63 61 73 65 20 45 58 5f 4c 69 73 74      case EX_List
9240: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9250: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9260: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
9270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9280: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 45 58 5f    }.    case EX_
9290: 52 69 67 68 74 3a 20 7b 0a 20 20 20 20 20 20 73  Right: {.      s
92a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
92b0: 28 64 62 2c 20 70 2d 3e 78 2e 70 52 69 67 68 74  (db, p->x.pRight
92c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65      }.  }.  p->e
92e0: 58 20 3d 20 45 58 5f 4e 6f 6e 65 3b 0a 7d 0a 76  X = EX_None;.}.v
92f0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
9300: 64 64 54 61 62 28 73 71 6c 69 74 65 33 20 2a 64  ddTab(sqlite3 *d
9310: 62 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  b, Expr *pExpr, 
9320: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
9330: 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
9340: 58 55 6e 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  XUnion(db, pExpr
9350: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 65 58 20 3d  );.  pExpr->eX =
9360: 20 45 58 5f 54 61 62 3b 0a 20 20 70 45 78 70 72   EX_Tab;.  pExpr
9370: 2d 3e 78 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  ->x.pTab = pTab;
9380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9390: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
93a0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
93b0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
93c0: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
93d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
93e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
93f0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
9400: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
9410: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
9420: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
9430: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
9440: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
9450: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
9460: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
9470: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9480: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
9490: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
94a0: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
94b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
94c0: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
94d0: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
94e0: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
94f0: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
9500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
9510: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
9520: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
9530: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9540: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
9550: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
9560: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
9570: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
9580: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
9590: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
95a0: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
95b0: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
95c0: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
95d0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
95e0: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
95f0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
9600: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
9610: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
9620: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
9630: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
9640: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
9650: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
9660: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
9670: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
9680: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96d0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
96e0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
96f0: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
9700: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
9710: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
9720: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
9730: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
9740: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
9750: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
9760: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
9770: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
9780: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
9790: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
97a0: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
97b0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
97c0: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
97d0: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
97e0: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
97f0: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
9800: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
9810: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
9820: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
9830: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
9840: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
9850: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
9860: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
9870: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
9880: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
9890: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
98a0: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
98b0: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
98c0: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
98d0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
98e0: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
98f0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
9900: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
9910: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
9920: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
9930: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
9940: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
9950: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
9960: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
9970: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
9980: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
9990: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
99a0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
99b0: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
99c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
99d0: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
99e0: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
99f0: 61 72 74 73 20 6f 66 20 74 68 65 20 45 78 70 72  arts of the Expr
9a00: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
9a10: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
9a20: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
9a30: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
9a40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9a50: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
9a60: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
9a70: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
9a80: 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50   make an EXPRDUP
9a90: 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20  _REDUCE copy of 
9aa0: 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73  a reduced expres
9ab0: 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c  sion.  It is onl
9ac0: 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65  y legal.** to re
9ad0: 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20  duce a pristine 
9ae0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9af0: 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e  from the parser.
9b00: 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    The implementa
9b10: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64  tion.** of duped
9b20: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
9b30: 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c   contain multipl
9b40: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
9b50: 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d  ments that attem
9b60: 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65  pt.** to enforce
9b70: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
9b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9b90: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
9ba0: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
9bb0: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
9bc0: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9bd0: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
9be0: 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d  EDUCE || flags==
9bf0: 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  0 ); /* Only one
9c00: 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f   flag value allo
9c10: 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  wed */.  assert(
9c20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d   EXPR_FULLSIZE<=
9c30: 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72  0xfff );.  asser
9c40: 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f  t( (0xfff & (EP_
9c50: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
9c60: 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Only))==0 );.  i
9c70: 66 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70  f( 0==flags || p
9c80: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
9c90: 43 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20  COLUMN .#ifndef 
9ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
9cb0: 4f 57 46 55 4e 43 0a 20 20 20 7c 7c 20 70 2d 3e  OWFUNC.   || p->
9cc0: 70 57 69 6e 20 0a 23 65 6e 64 69 66 0a 20 20 29  pWin .#endif.  )
9cd0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
9ce0: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d  PR_FULLSIZE;.  }
9cf0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9d00: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
9d10: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
9d20: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
9d30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
9d40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9d50: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
9d60: 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ; .    assert( !
9d70: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9d80: 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20  p, EP_MemToken) 
9d90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9da0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9db0: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20  p, EP_NoReduce) 
9dc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
9dd0: 65 66 74 20 7c 7c 20 70 2d 3e 65 58 21 3d 45 58  eft || p->eX!=EX
9de0: 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  _None ){.      n
9df0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
9e00: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
9e10: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
9e20: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
9e30: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
9e40: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
9e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e60: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
9e70: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9e80: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
9e90: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
9ea0: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
9eb0: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
9ec0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
9ed0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
9ee0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
9ef0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
9f00: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
9f10: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
9f20: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
9f30: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
9f40: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
9f50: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
9f60: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
9f70: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
9f80: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
9f90: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
9fa0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
9fb0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
9fc0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
9fd0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
9fe0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
9ff0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
a000: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
a010: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
a020: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
a030: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
a040: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
a050: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
a060: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
a070: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
a080: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a090: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
a0a0: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
a0b0: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
a0c0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a0d0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
a0e0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
a0f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
a100: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
a110: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
a120: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
a130: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
a140: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
a150: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
a160: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
a170: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
a180: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
a190: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
a1a0: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
a1b0: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
a1c0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
a1d0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
a1e0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
a1f0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
a200: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
a210: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
a220: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
a230: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
a240: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
a250: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
a260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
a270: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
a280: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
a290: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
a2a0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
a2b0: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
a2c0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
a2d0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
a2e0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
a2f0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
a300: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
a310: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
a320: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  gs);.      if( p
a330: 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29  ->eX==EX_Right )
a340: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
a350: 78 70 72 53 69 7a 65 28 70 2d 3e 78 2e 70 52 69  xprSize(p->x.pRi
a360: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
a370: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a380: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
a390: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
a3a0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
a3b0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
a3c0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
a3d0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
a3e0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
a3f0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
a400: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
a410: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
a420: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
a430: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
a440: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
a450: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
a460: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
a470: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
a480: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
a490: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 78 2e 70  pLeft and p->x.p
a4a0: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
a4b0: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
a4c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
a4d0: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
a4e0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
a4f0: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70  te past the.** p
a500: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
a510: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
a520: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a530: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
a540: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
a550: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
a560: 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75   int dupFlags, u
a570: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
a580: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
a590: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
a5a0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75  to return */.  u
a5b0: 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20  8 *zAlloc;      
a5c0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
a5d0: 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20  pace from which 
a5e0: 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62  to build Expr ob
a5f0: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74  ject */.  u32 st
a600: 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20  aticFlag;       
a610: 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20  /* EP_Static if 
a620: 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e  space not obtain
a630: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
a640: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  /..  assert( db!
a650: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a660: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  p );.  assert( d
a670: 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75  upFlags==0 || du
a680: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
a690: 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65  REDUCE );.  asse
a6a0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
a6b0: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
a6c0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a  RDUP_REDUCE );..
a6d0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
a6e0: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
a6f0: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
a700: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20  cture. */.  if( 
a710: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
a720: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
a730: 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  er;.    staticFl
a740: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
a750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c    }else{.    zAl
a760: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
a770: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64  allocRawNN(db, d
a780: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
a790: 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  dupFlags));.    
a7a0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
a7b0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78    }.  pNew = (Ex
a7c0: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
a7d0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
a7e0: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
a7f0: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
a800: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
a810: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
a820: 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65  to.    ** by pNe
a830: 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65  w. This is eithe
a840: 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  r EXPR_FULLSIZE,
a850: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
a860: 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52  E or.    ** EXPR
a870: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
a880: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
a890: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
a8a0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
a8b0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
a8c0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
a8d0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
a8e0: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
a8f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
a900: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
a910: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
a920: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
a930: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
a940: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
a950: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
a960: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
a970: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
a980: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
a990: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
a9a0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54  oken ){.      nT
a9b0: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
a9c0: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
a9d0: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  en) + 1;.    }el
a9e0: 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  se{.      nToken
a9f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
aa00: 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a  if( dupFlags ){.
aa10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
aa20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
aa30: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
aa40: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
aa50: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
aa60: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
aa70: 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65  .      u32 nSize
aa80: 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75   = (u32)exprStru
aa90: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
aaa0: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
aab0: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
aac0: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
aad0: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
aae0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
aaf0: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
ab00: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
ab10: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
ab20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
ab30: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
ab40: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
ab50: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
ab60: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
ab70: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  */.    pNew->fla
ab80: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
ab90: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
aba0: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
abb0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77  Token);.    pNew
abc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
abd0: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
abe0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
abf0: 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  y);.    pNew->fl
ac00: 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61  ags |= staticFla
ac10: 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
ac20: 4e 65 77 2d 3e 65 58 3d 3d 70 2d 3e 65 58 20 29  New->eX==p->eX )
ac30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
ac40: 65 77 2d 3e 65 56 3d 3d 70 2d 3e 65 56 20 29 3b  ew->eV==p->eV );
ac50: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
ac60: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
ac70: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
ac80: 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20  .    if( nToken 
ac90: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
aca0: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
acb0: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
acc0: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
acd0: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
ace0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
acf0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
ad00: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d    }..    if( 0==
ad10: 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d  ((p->flags|pNew-
ad20: 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54 6f  >flags) & (EP_To
ad30: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29  kenOnly|EP_Leaf)
ad40: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
ad50: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
ad60: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
ad70: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
ad80: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  r. */.      swit
ad90: 63 68 28 20 70 2d 3e 65 58 20 29 7b 0a 20 20 20  ch( p->eX ){.   
ada0: 20 20 20 20 20 63 61 73 65 20 45 58 5f 53 65 6c       case EX_Sel
adb0: 65 63 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ect: {.         
adc0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 65   assert( pNew->e
add0: 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 29 3b 0a  X==EX_Select );.
ade0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
adf0: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
ae00: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
ae10: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64   p->x.pSelect, d
ae20: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
ae30: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 78 2e      if( pNew->x.
ae40: 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 70 4e 65  pSelect==0 ) pNe
ae50: 77 2d 3e 65 58 20 3d 20 45 58 5f 4e 6f 6e 65 3b  w->eX = EX_None;
ae60: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
ae70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ae80: 20 20 20 20 63 61 73 65 20 45 58 5f 4c 69 73 74      case EX_List
ae90: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  : {.          as
aea0: 73 65 72 74 28 20 70 4e 65 77 2d 3e 65 58 3d 3d  sert( pNew->eX==
aeb0: 45 58 5f 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  EX_List );.     
aec0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
aed0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
aee0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
aef0: 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73  .pList, dupFlags
af00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
af10: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 3d 3d   pNew->x.pList==
af20: 30 20 29 20 70 4e 65 77 2d 3e 65 58 20 3d 20 45  0 ) pNew->eX = E
af30: 58 5f 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20  X_None;.        
af40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
af50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
af60: 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ..    /* Fill in
af70: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
af80: 20 70 4e 65 77 2d 3e 78 2e 70 52 69 67 68 74 2e   pNew->x.pRight.
af90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72   */.    if( Expr
afa0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
afb0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
afc0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
afd0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
afe0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
aff0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
b000: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
b010: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
b020: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
b030: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
b040: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
b050: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
b070: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
b080: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
b090: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
b0a0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
b0b0: 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29  ->eX==EX_Right )
b0c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
b0d0: 2d 3e 78 2e 70 52 69 67 68 74 20 3d 20 65 78 70  ->x.pRight = exp
b0e0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 52  rDup(db, p->x.pR
b0f0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
b100: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
b110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b120: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75  }.      if( pzBu
b130: 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ffer ){.        
b140: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
b150: 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  oc;.      }.    
b160: 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 53  }else{.#ifndef S
b170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
b180: 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66 28 20  WFUNC.      if( 
b190: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
b1a0: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  p, EP_Reduced|EP
b1b0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
b1c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 57 69         pNew->pWi
b1d0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 0;.      }el
b1e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
b1f0: 2d 3e 70 57 69 6e 20 3d 20 73 71 6c 69 74 65 33  ->pWin = sqlite3
b200: 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 70 4e  WindowDup(db, pN
b210: 65 77 2c 20 70 2d 3e 70 57 69 6e 29 3b 0a 20 20  ew, p->pWin);.  
b220: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
b230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
b240: 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20  OWFUNC */.      
b250: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
b260: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
b270: 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b  Only|EP_Leaf) ){
b280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
b290: 77 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  w->op==TK_SELECT
b2a0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
b2b0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
b2c0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
b2d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b2e0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  ->iColumn==0 || 
b2f0: 70 2d 3e 65 58 21 3d 45 58 5f 52 69 67 68 74 20  p->eX!=EX_Right 
b300: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
b310: 4f 4c 44 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  OLD: assert( p->
b320: 70 52 69 67 68 74 3d 3d 30 20 20 7c 7c 20 70 2d  pRight==0  || p-
b330: 3e 78 2e 70 52 69 67 68 74 3d 3d 70 2d 3e 70 4c  >x.pRight==p->pL
b340: 65 66 74 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  eft ); */.      
b350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b360: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
b370: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b380: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
b390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b3a0: 20 20 20 20 69 66 28 20 70 2d 3e 65 58 3d 3d 45      if( p->eX==E
b3b0: 58 5f 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  X_Right ){.     
b3c0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 52 69       pNew->x.pRi
b3d0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
b3e0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 52  rDup(db, p->x.pR
b3f0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
b400: 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 78 2e      if( pNew->x.
b410: 70 52 69 67 68 74 3d 3d 30 20 29 20 70 4e 65 77  pRight==0 ) pNew
b420: 2d 3e 65 58 20 3d 20 45 58 5f 4e 6f 6e 65 3b 0a  ->eX = EX_None;.
b430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b440: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
b450: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
b460: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
b470: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
b480: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
b490: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
b4a0: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
b4b0: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
b4c0: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
b4d0: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
b4e0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
b4f0: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
b500: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
b510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b520: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
b530: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
b540: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
b550: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
b560: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
b570: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
b580: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
b590: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
b5a0: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
b5b0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
b5c0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b5d0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
b5e0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
b5f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
b600: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
b610: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
b620: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
b630: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
b640: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
b650: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
b660: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
b670: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
b680: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
b690: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
b6a0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
b6b0: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
b6c0: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
b6d0: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
b6e0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
b6f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
b700: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b710: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
b720: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
b730: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
b740: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
b750: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
b760: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
b770: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
b780: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
b790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
b7a0: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
b7b0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
b7c0: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
b7d0: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
b7e0: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
b7f0: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
b800: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
b810: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
b820: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
b830: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
b840: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
b850: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
b860: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
b870: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
b880: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
b890: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
b8a0: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
b8b0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
b8c0: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
b8d0: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
b8e0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
b8f0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
b900: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
b910: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
b920: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
b930: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
b940: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
b950: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
b960: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
b970: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
b980: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
b990: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
b9a0: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
b9b0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
b9c0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
b9d0: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
b9e0: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
b9f0: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
ba00: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
ba10: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
ba20: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
ba30: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
ba40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
ba50: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
ba60: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
ba70: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
ba80: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
ba90: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
baa0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
bab0: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
bac0: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
bad0: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
bae0: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
baf0: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
bb00: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
bb10: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
bb20: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
bb30: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
bb40: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
bb50: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
bb60: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bb70: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
bb80: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
bb90: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
bba0: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
bbb0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
bbc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
bbd0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
bbe0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
bbf0: 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65  RawNN(db, sqlite
bc00: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
bc10: 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  , p));.  if( pNe
bc20: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
bc30: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
bc40: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74   p->nExpr;.  pIt
bc50: 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20  em = pNew->a;.  
bc60: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
bc70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
bc80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
bc90: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
bca0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
bcb0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
bcc0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ->pExpr;.    Exp
bcd0: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
bce0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
bcf0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bd00: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
bd10: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  gs);.    if( pOl
bd20: 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70  dExpr .     && p
bd30: 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  OldExpr->op==TK_
bd40: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20  SELECT_COLUMN.  
bd50: 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20     && (pNewExpr 
bd60: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21  = pItem->pExpr)!
bd70: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
bd80: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
bd90: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  r->iColumn==0 ||
bda0: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66   i>0 );.      if
bdb0: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
bdc0: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
bdd0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78    assert( pOldEx
bde0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45  pr->pLeft==pOldE
bdf0: 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 20 29 3b  xpr->x.pRight );
be00: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 53  .        pPriorS
be10: 65 6c 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45  electCol = pNewE
be20: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65  xpr->pLeft = pNe
be30: 77 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 3b  wExpr->x.pRight;
be40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
be50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
be60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
be70: 65 72 74 28 20 70 49 74 65 6d 5b 2d 31 5d 2e 70  ert( pItem[-1].p
be80: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
be90: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
bea0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
beb0: 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 69  tem[-1].pExpr->i
bec0: 43 6f 6c 75 6d 6e 2b 31 20 29 3b 0a 20 20 20 20  Column+1 );.    
bed0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
bee0: 6f 72 53 65 6c 65 63 74 43 6f 6c 3d 3d 70 49 74  orSelectCol==pIt
bef0: 65 6d 5b 2d 31 5d 2e 70 45 78 70 72 2d 3e 70 4c  em[-1].pExpr->pL
bf00: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  eft );.        p
bf10: 4e 65 77 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  NewExpr->pLeft =
bf20: 20 70 50 72 69 6f 72 53 65 6c 65 63 74 43 6f 6c   pPriorSelectCol
bf30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bf40: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
bf50: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
bf60: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
bf70: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
bf80: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
bf90: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
bfa0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  pOldItem->zSpan)
bfb0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
bfc0: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
bfd0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
bfe0: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
bff0: 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  0;.    pItem->bS
c000: 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49  panIsTab = pOldI
c010: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b  tem->bSpanIsTab;
c020: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72  .    pItem->bSor
c030: 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49 74 65  terRef = pOldIte
c040: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b 0a 20  m->bSorterRef;. 
c050: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
c060: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
c070: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c080: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
c090: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
c0a0: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
c0b0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
c0c0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
c0d0: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
c0e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
c0f0: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
c100: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
c110: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
c120: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
c130: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
c140: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
c150: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
c160: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
c170: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c180: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
c190: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c1a0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
c1b0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
c1c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c1d0: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
c1e0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
c1f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
c200: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
c210: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
c220: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
c230: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73  int nByte;.  ass
c240: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
c250: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c260: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
c270: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
c280: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
c290: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
c2a0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
c2b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c2c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
c2d0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
c2e0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
c2f0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
c300: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
c310: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
c320: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
c330: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
c340: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
c350: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
c360: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
c370: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
c380: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
c390: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
c3a0: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
c3b0: 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
c3c0: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
c3d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
c3e0: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
c3f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c400: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
c410: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
c420: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
c430: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
c440: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
c450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
c460: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
c470: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
c480: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
c490: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d    pNewItem->fg =
c4a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20   pOldItem->fg;. 
c4b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
c4c0: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
c4d0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
c4e0: 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ewItem->addrFill
c4f0: 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Sub = pOldItem->
c500: 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20  addrFillSub;.   
c510: 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65   pNewItem->regRe
c520: 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  turn = pOldItem-
c530: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
c540: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
c550: 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
c560: 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e        pNewItem->
c570: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
c580: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
c590: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
c5a0: 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
c5b0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
c5c0: 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c  ->pIBIndex = pOl
c5d0: 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b  dItem->pIBIndex;
c5e0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
c5f0: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
c600: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
c610: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
c620: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
c630: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
c640: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
c650: 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29  pFuncArg, flags)
c660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
c670: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
c680: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
c690: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
c6a0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
c6b0: 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  nTabRef++;.    }
c6c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
c6d0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
c6e0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
c6f0: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
c700: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c710: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
c720: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c730: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
c740: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
c750: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
c760: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
c770: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
c780: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
c790: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
c7a0: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
c7b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
c7c0: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
c7d0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
c7e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
c7f0: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
c800: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
c810: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
c820: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
c830: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
c840: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
c850: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
c860: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
c870: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
c880: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
c890: 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20  nId = p->nId;.  
c8a0: 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65  pNew->a = sqlite
c8b0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
c8c0: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
c8d0: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
c8e0: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
c8f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c900: 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29 3b 0a  eeNN(db, pNew);.
c910: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c920: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
c930: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
c940: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
c950: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
c960: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
c970: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
c980: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
c990: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
c9a0: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
c9b0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
c9c0: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
c9d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
c9e0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
c9f0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
ca00: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
ca10: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
ca20: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
ca30: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
ca40: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
ca50: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
ca60: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
ca70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ca80: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
ca90: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
caa0: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
cab0: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
cac0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
cad0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
cae0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
caf0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44 75 70  db, Select *pDup
cb00: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
cb10: 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d 20 30  Select *pRet = 0
cb20: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78  ;.  Select *pNex
cb30: 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  t = 0;.  Select 
cb40: 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 20 20  **pp = &pRet;.  
cb50: 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20 61 73  Select *p;..  as
cb60: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
cb70: 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70 3b 20   for(p=pDup; p; 
cb80: 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  p=p->pPrior){.  
cb90: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 20 3d    Select *pNew =
cba0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
cbb0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
cbc0: 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66 28 20  (*p) );.    if( 
cbd0: 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pNew==0 ) break;
cbe0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  .    pNew->pELis
cbf0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
cc00: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
cc10: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
cc20: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
cc30: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
cc40: 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c  (db, p->pSrc, fl
cc50: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ags);.    pNew->
cc60: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
cc70: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
cc80: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
cc90: 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42     pNew->pGroupB
cca0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
ccb0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
ccc0: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
ccd0: 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e      pNew->pHavin
cce0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
ccf0: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
cd00: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  g, flags);.    p
cd10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
cd20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cd30: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
cd40: 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  By, flags);.    
cd50: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
cd60: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ;.    pNew->pNex
cd70: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 70  t = pNext;.    p
cd80: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  New->pPrior = 0;
cd90: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  .    pNew->pLimi
cda0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
cdb0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
cdc0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
cdd0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
cde0: 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65      pNew->iOffse
cdf0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  t = 0;.    pNew-
ce00: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
ce10: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
ce20: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
ce30: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
ce40: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[0] = -1;.   
ce50: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
ce60: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[1] = -1;.   
ce70: 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f   pNew->nSelectRo
ce80: 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w = p->nSelectRo
ce90: 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69  w;.    pNew->pWi
cea0: 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c  th = withDup(db,
ceb0: 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69 66 6e   p->pWith);.#ifn
cec0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ced0: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 70  WINDOWFUNC.    p
cee0: 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a 20  New->pWin = 0;. 
cef0: 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66     pNew->pWinDef
cf00: 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  n = sqlite3Windo
cf10: 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  wListDup(db, p->
cf20: 70 57 69 6e 44 65 66 6e 29 3b 0a 23 65 6e 64 69  pWinDefn);.#endi
cf30: 66 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 6c 49  f.    pNew->selI
cf40: 64 20 3d 20 70 2d 3e 73 65 6c 49 64 3b 0a 20 20  d = p->selId;.  
cf50: 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
cf60: 20 20 70 70 20 3d 20 26 70 4e 65 77 2d 3e 70 50    pp = &pNew->pP
cf70: 72 69 6f 72 3b 0a 20 20 20 20 70 4e 65 78 74 20  rior;.    pNext 
cf80: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 72  = pNew;.  }..  r
cf90: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
cfa0: 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  lse.Select *sqli
cfb0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
cfc0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
cfd0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
cfe0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
cff0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
d000: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
d010: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
d020: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
d030: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
d040: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
d050: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
d060: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
d070: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
d080: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
d090: 20 70 4c 69 73 74 20 61 72 67 75 6d 65 6e 74 20   pList argument 
d0a0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
d0b0: 55 4c 4c 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  ULL or a pointer
d0c0: 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74 0a   to an ExprList.
d0d0: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
d0e0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
d0f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d100: 41 70 70 65 6e 64 28 29 2e 20 20 54 68 69 73 20  Append().  This 
d110: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 79 20 6e  routine.** may n
d120: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
d130: 61 6e 20 45 78 70 72 4c 69 73 74 20 6f 62 74 61  an ExprList obta
d140: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
d150: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a  3ExprListDup()..
d160: 2a 2a 20 52 65 61 73 6f 6e 3a 20 20 54 68 69 73  ** Reason:  This
d170: 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
d180: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
d190: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 70 4c 69   of slots in pLi
d1a0: 73 74 2d 3e 61 5b 5d 0a 2a 2a 20 69 73 20 61 20  st->a[].** is a 
d1b0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 20 54  power of two.  T
d1c0: 68 61 74 20 69 73 20 74 72 75 65 20 66 6f 72 20  hat is true for 
d1d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
d1e0: 70 70 65 6e 64 28 29 20 72 65 74 75 72 6e 73 0a  ppend() returns.
d1f0: 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20 6e 65  ** but is not ne
d200: 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20 66  cessarily true f
d210: 72 6f 6d 20 74 68 65 20 72 65 74 75 72 6e 20 76  rom the return v
d220: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 45  alue of sqlite3E
d230: 78 70 72 4c 69 73 74 44 75 70 28 29 2e 0a 2a 2a  xprListDup()..**
d240: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
d250: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
d260: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
d270: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
d280: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
d290: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
d2a0: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
d2b0: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
d2c0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
d2d0: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
d2e0: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
d2f0: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
d300: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
d310: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
d320: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d340: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d350: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d360: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
d370: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
d380: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
d390: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
d3a0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
d3b0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
d3c0: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
d3d0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
d3e0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
d3f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
d400: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d410: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d420: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
d430: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
d440: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
d450: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
d460: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
d470: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
d480: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
d490: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
d4a0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
d4b0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
d4c0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
d4d0: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
d4e0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
d4f0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
d500: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20  *pNew;.    pNew 
d510: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
d520: 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 20 0a 20  oc(db, pList, . 
d530: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
d540: 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a 70 4c  of(*pList)+(2*pL
d550: 69 73 74 2d 3e 6e 45 78 70 72 20 2d 20 31 29 2a  ist->nExpr - 1)*
d560: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
d570: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  0]));.    if( pN
d580: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ew==0 ){.      g
d590: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
d5a0: 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
d5b0: 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
d5c0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
d5d0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61  t->nExpr++];.  a
d5e0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
d5f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d600: 69 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a  item,zName)==siz
d610: 65 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  eof(pItem->pExpr
d620: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
d630: 66 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45  ffsetof(struct E
d640: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78  xprList_item,pEx
d650: 70 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  pr)==0 );.  mems
d660: 65 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  et(&pItem->zName
d670: 2c 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  ,0,sizeof(*pItem
d680: 29 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63  )-offsetof(struc
d690: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c  t ExprList_item,
d6a0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d  zName));.  pItem
d6b0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
d6c0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
d6d0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
d6e0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
d6f0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
d700: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
d710: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
d720: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
d730: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
d740: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
d750: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
d760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75  ;.}../*.** pColu
d770: 6d 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f  mns and pExpr fo
d780: 72 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69  rm a vector assi
d790: 67 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gnment which is 
d7a0: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a  part of the SET.
d7b0: 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ** clause of an 
d7c0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
d7d0: 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
d7e0: 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c  .**        (a,b,
d7f0: 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72  c) = (expr1,expr
d800: 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20  2,expr3).** Or: 
d810: 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45     (a,b,c) = (SE
d820: 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20  LECT x,y,z FROM 
d830: 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ....).**.** For 
d840: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
d850: 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65   vector assignme
d860: 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65  nt, append new e
d870: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a  ntries to the.**
d880: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d890: 20 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20   pList.  In the 
d8a0: 63 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65  case of a subque
d8b0: 72 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61  ry on the RHS, a
d8c0: 70 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45  ppend.** TK_SELE
d8d0: 43 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73  CT_COLUMN expres
d8e0: 73 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69  sions..*/.ExprLi
d8f0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
d900: 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28  istAppendVector(
d910: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d920: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
d930: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d940: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d950: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
d960: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
d970: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
d980: 4c 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  LL */.  IdList *
d990: 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f  pColumns,      /
d9a0: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  * List of names 
d9b0: 6f 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73  of LHS of the as
d9c0: 73 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  signment */.  Ex
d9d0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
d9e0: 20 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65       /* Vector e
d9f0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
da00: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
da10: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
da20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
da30: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
da40: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
da50: 74 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74  t iFirst = pList
da60: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
da70: 3a 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d  : 0;.  /* pColum
da80: 6e 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e  ns can only be N
da90: 55 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ULL due to an OO
daa0: 4d 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c  M but an OOM wil
dab0: 6c 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20  l cause an.  ** 
dac0: 65 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68  exit prior to th
dad0: 69 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67  is routine being
dae0: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66   invoked */.  if
daf0: 28 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73  ( NEVER(pColumns
db00: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74  ==0) ) goto vect
db10: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
db20: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
db30: 29 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70  ) goto vector_ap
db40: 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f  pend_error;..  /
db50: 2a 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20  * If the RHS is 
db60: 61 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77  a vector, then w
db70: 65 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c  e can immediatel
db80: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  y check to see t
db90: 68 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69  hat .  ** the si
dba0: 7a 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e  ze of the RHS an
dbb0: 64 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75  d LHS match.  Bu
dbc0: 74 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  t if the RHS is 
dbd0: 61 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20  a SELECT, .  ** 
dbe0: 77 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20  wildcards ("*") 
dbf0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
dc00: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
dc10: 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
dc20: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20   before.  ** we 
dc30: 63 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20  can do the size 
dc40: 63 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20  check, so defer 
dc50: 74 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75  the size check u
dc60: 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
dc70: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
dc80: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
dc90: 45 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e  ELECT && pColumn
dca0: 73 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74  s->nId!=(n=sqlit
dcb0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
dcc0: 28 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20  (pExpr)) ){.    
dcd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
dce0: 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
dcf0: 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
dd00: 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
dd20: 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a  lumns->nId, n);.
dd30: 20 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f      goto vector_
dd40: 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20  append_error;.  
dd50: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
dd60: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69  pColumns->nId; i
dd70: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
dd80: 53 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65  SubExpr = sqlite
dd90: 33 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69  3ExprForVectorFi
dda0: 65 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  eld(pParse, pExp
ddb0: 72 2c 20 69 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, i);.    pList
ddc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ddd0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
dde0: 20 70 4c 69 73 74 2c 20 70 53 75 62 45 78 70 72   pList, pSubExpr
ddf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
de00: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
de10: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
de20: 69 46 69 72 73 74 2b 69 2b 31 20 29 3b 0a 20 20  iFirst+i+1 );.  
de30: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
de40: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  st->nExpr-1].zNa
de50: 6d 65 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61  me = pColumns->a
de60: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
de70: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
de80: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  zName = 0;.    }
de90: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 64 62 2d  .  }..  if( !db-
dea0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
deb0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
dec0: 45 4c 45 43 54 20 26 26 20 41 4c 57 41 59 53 28  ELECT && ALWAYS(
ded0: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
dee0: 20 45 78 70 72 20 2a 70 46 69 72 73 74 20 3d 20   Expr *pFirst = 
def0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 5d  pList->a[iFirst]
df00: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
df10: 72 74 28 20 70 46 69 72 73 74 21 3d 30 20 29 3b  rt( pFirst!=0 );
df20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
df30: 72 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  rst->op==TK_SELE
df40: 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  CT_COLUMN );.   
df50: 20 20 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20    .    /* Store 
df60: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
df70: 6d 65 6e 74 20 69 6e 20 70 52 69 67 68 74 20 73  ment in pRight s
df80: 6f 20 69 74 20 77 69 6c 6c 20 62 65 20 64 65 6c  o it will be del
df90: 65 74 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  eted when.    **
dfa0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dfb0: 44 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c  Delete() is call
dfc0: 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
dfd0: 28 20 70 46 69 72 73 74 2d 3e 65 58 3d 3d 45 58  ( pFirst->eX==EX
dfe0: 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 70 46 69  _None );.    pFi
dff0: 72 73 74 2d 3e 78 2e 70 52 69 67 68 74 20 3d 20  rst->x.pRight = 
e000: 70 45 78 70 72 3b 0a 20 20 20 20 70 46 69 72 73  pExpr;.    pFirs
e010: 74 2d 3e 65 58 20 3d 20 45 58 5f 52 69 67 68 74  t->eX = EX_Right
e020: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 30 3b  ;.    pExpr = 0;
e030: 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65  ..    /* Remembe
e040: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
e050: 65 20 4c 48 53 20 69 6e 20 69 54 61 62 6c 65 20  e LHS in iTable 
e060: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63  so that we can c
e070: 68 65 63 6b 20 74 68 61 74 0a 20 20 20 20 2a 2a  heck that.    **
e080: 20 74 68 65 20 52 48 53 20 61 6e 64 20 4c 48 53   the RHS and LHS
e090: 20 73 69 7a 65 73 20 6d 61 74 63 68 20 64 75 72   sizes match dur
e0a0: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
e0b0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 46 69 72  ion. */.    pFir
e0c0: 73 74 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43 6f  st->iTable = pCo
e0d0: 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  lumns->nId;.  }.
e0e0: 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65  .vector_append_e
e0f0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  rror:.  sqlite3E
e100: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
e110: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  xpr);.  sqlite3I
e120: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
e130: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72 65 74  pColumns);.  ret
e140: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
e150: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72 74  .** Set the sort
e160: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6c   order for the l
e170: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74  ast element on t
e180: 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69 73  he given ExprLis
e190: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
e1a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
e1b0: 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74 20  tOrder(ExprList 
e1c0: 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72 64  *p, int iSortOrd
e1d0: 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  er){.  if( p==0 
e1e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
e1f0: 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  rt( SQLITE_SO_UN
e200: 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51 4c  DEFINED<0 && SQL
e210: 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26  ITE_SO_ASC>=0 &&
e220: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e   SQLITE_SO_DESC>
e230: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e240: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 69  ->nExpr>0 );.  i
e250: 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30 20  f( iSortOrder<0 
e260: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e270: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
e280: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
e290: 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20  E_SO_ASC );.    
e2a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d  return;.  }.  p-
e2b0: 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73  >a[p->nExpr-1].s
e2c0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 69  ortOrder = (u8)i
e2d0: 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a  SortOrder;.}../*
e2e0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
e2f0: 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65  List.a[].zName e
e300: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
e310: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
e320: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
e330: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
e340: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
e350: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
e360: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
e370: 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73  or.  But pName s
e380: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
e390: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
e3a0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
e3b0: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
e3c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
e3d0: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
e3e0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
e3f0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
e400: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
e410: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
e420: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e430: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e440: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
e450: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
e460: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
e470: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
e480: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
e490: 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64  Name to be added
e4a0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
e4b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
e4c0: 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20 74   True to cause t
e4d0: 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65  he name to be de
e4e0: 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  quoted */.){.  a
e4f0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
e500: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
e510: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
e520: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
e530: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
e540: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e550: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
e560: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
e570: 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69      pItem = &pLi
e580: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
e590: 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  pr-1];.    asser
e5a0: 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d  t( pItem->zName=
e5b0: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
e5c0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
e5d0: 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65  DbStrNDup(pParse
e5e0: 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  ->db, pName->z, 
e5f0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  pName->n);.    i
e600: 66 28 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c  f( dequote ) sql
e610: 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74 65  ite3Dequote(pIte
e620: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  m->zName);.    i
e630: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
e640: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
e650: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
e660: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
e670: 2a 29 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  *)pItem->zName, 
e680: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
e690: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
e6a0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
e6b0: 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  zSpan element of
e6c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e6d0: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
e6e0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
e6f0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
e700: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
e710: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
e720: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
e730: 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76  pSpan should nev
e740: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
e750: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
e760: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
e770: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
e780: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
e790: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
e7a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
e7b0: 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72  stSetSpan(.  Par
e7c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e7d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e7e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e7f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
e800: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
e810: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
e820: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73   span. */.  cons
e830: 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20  t char *zStart, 
e840: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
e850: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f  the span */.  co
e860: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
e870: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
e880: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20  the span */.){. 
e890: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e8a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
e8b0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e8c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e8d0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
e8e0: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
e8f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e900: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
e910: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
e920: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
e930: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
e940: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
e950: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
e960: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
e970: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
e980: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
e990: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
e9a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
e9b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e9c0: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
e9d0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
e9e0: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
e9f0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
ea00: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
ea10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ea20: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
ea30: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
ea40: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
ea50: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
ea60: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
ea70: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
ea80: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
ea90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
eaa0: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
eab0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
eac0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
ead0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
eae0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
eaf0: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
eb00: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
eb10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
eb20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
eb30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
eb40: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
eb50: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
eb60: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
eb70: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
eb80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
eb90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
eba0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
ebb0: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
ebc0: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
ebd0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
ebe0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73  {.  int i = pLis
ebf0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75  t->nExpr;.  stru
ec00: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ec10: 20 2a 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74   *pItem =  pList
ec20: 2d 3e 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ->a;.  assert( p
ec30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
ec40: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
ec50: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
ec60: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
ec70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ec80: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
ec90: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
eca0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
ecb0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
ecc0: 74 65 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  tem++;.  }while(
ecd0: 20 2d 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69   --i>0 );.  sqli
ece0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
ecf0: 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73  pList);.}.void s
ed00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ed10: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
ed20: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
ed30: 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  t){.  if( pList 
ed40: 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  ) exprListDelete
ed50: 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
ed60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ed70: 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66  he bitwise-OR of
ed80: 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20   all Expr.flags 
ed90: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69  fields in the gi
eda0: 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ven.** ExprList.
edb0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45  .*/.u32 sqlite3E
edc0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e  xprListFlags(con
edd0: 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
ede0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
edf0: 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73  u32 m = 0;.  ass
ee00: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
ee10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
ee20: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
ee30: 7b 0a 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  {.     Expr *pEx
ee40: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
ee50: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73  .pExpr;.     ass
ee60: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
ee70: 0a 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72  .     m |= pExpr
ee80: 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72  ->flags;.  }.  r
ee90: 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn m;.}../*.*
eea0: 2a 20 54 68 69 73 20 69 73 20 61 20 53 45 4c 45  * This is a SELE
eeb0: 43 54 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b  CT-node callback
eec0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
eed0: 69 6f 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a  ion walker that.
eee0: 2a 2a 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73  ** always "fails
eef0: 22 2e 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e  ".  By "fail" in
ef00: 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d   this case, we m
ef10: 65 61 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b  ean set.** pWalk
ef20: 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72  er->eCode to zer
ef30: 6f 20 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a  o and abort..**.
ef40: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
ef50: 20 69 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74   is used by mult
ef60: 69 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  iple expression 
ef70: 77 61 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20  walkers..*/.int 
ef80: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
ef90: 6b 46 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57  kFail(Walker *pW
efa0: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
efb0: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
efc0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
efd0: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
efe0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
eff0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
f000: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
f010: 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
f020: 20 69 73 20 61 6e 20 49 44 20 77 69 74 68 20 74   is an ID with t
f030: 68 65 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f  he name "true" o
f040: 72 20 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65  r "false".** the
f050: 6e 20 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74  n convert it int
f060: 6f 20 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53  o an TK_TRUEFALS
f070: 45 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  E term.  Return 
f080: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74  non-zero if.** t
f090: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61  he conversion ha
f0a0: 70 70 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f  ppened, and zero
f0b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f0c0: 6f 6e 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  on is unaltered.
f0d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f0e0: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
f0f0: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
f100: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f110: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78  op==TK_ID || pEx
f120: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pr->op==TK_STRIN
f130: 47 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  G );.  if( sqlit
f140: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
f150: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 74 72 75 65  >u.zToken, "true
f160: 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 71 6c 69  ")==0.   || sqli
f170: 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
f180: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c  ->u.zToken, "fal
f190: 73 65 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  se")==0.  ){.   
f1a0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
f1b0: 54 52 55 45 46 41 4c 53 45 3b 0a 20 20 20 20 72  TRUEFALSE;.    r
f1c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
f1d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f1e0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  * The argument m
f1f0: 75 73 74 20 62 65 20 61 20 54 4b 5f 54 52 55 45  ust be a TK_TRUE
f200: 46 41 4c 53 45 20 45 78 70 72 20 6e 6f 64 65 2e  FALSE Expr node.
f210: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69 74    Return 1 if it
f220: 20 69 73 20 54 52 55 45 0a 2a 2a 20 61 6e 64 20   is TRUE.** and 
f230: 30 20 69 66 20 69 74 20 69 73 20 46 41 4c 53 45  0 if it is FALSE
f240: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f250: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 63  ExprTruthValue(c
f260: 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
f270: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ){.  assert( pEx
f280: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  pr->op==TK_TRUEF
f290: 41 4c 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ALSE );.  assert
f2a0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f2b0: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
f2c0: 2c 22 74 72 75 65 22 29 3d 3d 30 0a 20 20 20 20  ,"true")==0.    
f2d0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72     || sqlite3Str
f2e0: 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  ICmp(pExpr->u.zT
f2f0: 6f 6b 65 6e 2c 22 66 61 6c 73 65 22 29 3d 3d 30  oken,"false")==0
f300: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78   );.  return pEx
f310: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d  pr->u.zToken[4]=
f320: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  =0;.}.../*.** Th
f330: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f340: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
f350: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
f360: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
f370: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
f380: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
f390: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
f3a0: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
f3b0: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
f3c0: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
f3d0: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
f3e0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
f3f0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
f400: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
f410: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
f420: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
f430: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
f440: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
f450: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f460: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
f470: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
f480: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
f490: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
f4a0: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
f4b0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
f4c0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
f4d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
f4e0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
f500: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
f510: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f520: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
f530: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
f540: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
f550: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
f560: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
f570: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
f580: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
f590: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
f5a0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
f5b0: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
f5c0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
f5d0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
f5e0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
f5f0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
f600: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
f610: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
f620: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
f630: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
f640: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
f650: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
f660: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
f670: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
f680: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
f690: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
f6a0: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
f6b0: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
f6c0: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
f6d0: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
f6e0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
f6f0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
f700: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
f710: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
f720: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f730: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
f740: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
f750: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
f760: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
f770: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
f780: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
f790: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
f7a0: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
f7b0: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
f7c0: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
f7d0: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
f7e0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
f7f0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
f800: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
f810: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
f820: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
f830: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
f840: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
f850: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
f860: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
f870: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
f880: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
f890: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
f8a0: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
f8b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
f8c0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
f8d0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
f8e0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
f8f0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
f900: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
f910: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
f920: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
f930: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
f940: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
f950: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
f960: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
f970: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
f980: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
f990: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
f9a0: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
f9b0: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
f9c0: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
f9d0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
f9e0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
f9f0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
fa00: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
fa10: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
fa20: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
fa30: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
fa40: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
fa50: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
fa60: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
fa70: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
fa80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
fa90: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
faa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fab0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
fac0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
fad0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
fae0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
faf0: 4b 5f 49 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43  K_ID:.      /* C
fb00: 6f 6e 76 65 72 74 20 22 74 72 75 65 22 20 6f 72  onvert "true" or
fb10: 20 22 66 61 6c 73 65 22 20 69 6e 20 61 20 44 45   "false" in a DE
fb20: 46 41 55 4c 54 20 63 6c 61 75 73 65 20 69 6e 74  FAULT clause int
fb30: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  o the.      ** a
fb40: 70 70 72 6f 70 72 69 61 74 65 20 54 4b 5f 54 52  ppropriate TK_TR
fb50: 55 45 46 41 4c 53 45 20 6f 70 65 72 61 74 6f 72  UEFALSE operator
fb60: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
fb70: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
fb80: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
fb90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fba0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
fbb0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
fbc0: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73   thru */.    cas
fbd0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
fbe0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
fbf0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
fc00: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
fc10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fc20: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
fc30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fc40: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
fc50: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
fc60: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
fc70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
fc80: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
fc90: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fca0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
fcb0: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
fcc0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
fcd0: 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f  Expr, EP_FixedCo
fce0: 6c 29 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65  l) && pWalker->e
fcf0: 43 6f 64 65 21 3d 32 20 29 7b 0a 20 20 20 20 20  Code!=2 ){.     
fd00: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
fd10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
fd20: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
fd30: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
fd40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
fd50: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
fd60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fd70: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
fd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
fd90: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
fda0: 20 20 20 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55     case TK_IF_NU
fdb0: 4c 4c 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  LL_ROW:.    case
fdc0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 0a 20 20   TK_REGISTER:.  
fdd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fde0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
fdf0: 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  STER );.      te
fe00: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fe10: 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
fe20: 57 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b  W );.      pWalk
fe30: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
fe40: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
fe50: 41 62 6f 72 74 3b 0a 20 20 20 20 63 61 73 65 20  Abort;.    case 
fe60: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
fe70: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
fe80: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
fe90: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
fea0: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
feb0: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
fec0: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
fed0: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
fee0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
fef0: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
ff00: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
ff10: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
ff20: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
ff30: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ff40: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
ff50: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
ff60: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
ff70: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
ff80: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
ff90: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
ffa0: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
ffb0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
ffc0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
ffd0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
ffe0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
fff0: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
10000 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
10010 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
10020 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
10030 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
10040 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
10050 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
10060 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
10070 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
10080 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
10090 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
100a0 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
100b0 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
100c0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
100d0 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
100e0 3b 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  ; /* sqlite3Sele
100f0 63 74 57 61 6c 6b 46 61 69 6c 28 29 20 64 69 73  ctWalkFail() dis
10100 61 6c 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  allows */.      
10110 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
10120 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
10130 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
10140 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
10150 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
10160 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
10170 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74    w.eCode = init
10180 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43  Flag;.  w.xExprC
10190 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
101a0 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
101b0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
101c0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
101d0 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
101e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
101f0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
10200 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
10210 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
10220 23 65 6e 64 69 66 0a 20 20 77 2e 75 2e 69 43 75  #endif.  w.u.iCu
10230 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
10240 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
10250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
10260 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
10270 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
10280 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
10290 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
102a0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
102b0 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
102c0 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
102d0 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
102e0 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
102f0 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
10300 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
10310 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
10320 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
10330 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
10340 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
10350 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
10360 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
10370 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
10380 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
10390 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
103a0 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
103b0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
103c0 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
103d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
103e0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
103f0 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
10400 2d 7a 65 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20  -zero if.**.**  
10410 20 28 31 29 20 74 68 65 20 65 78 70 72 65 73 73   (1) the express
10420 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
10430 20 61 6e 64 0a 2a 2a 20 20 20 28 32 29 20 74 68   and.**   (2) th
10440 65 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  e expression doe
10450 73 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  s originate in t
10460 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
10470 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
10480 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61  f a LEFT JOIN, a
10490 6e 64 0a 2a 2a 20 20 20 28 33 29 20 74 68 65 20  nd.**   (3) the 
104a0 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
104b0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
104c0 45 50 5f 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43  EP_FixedCol TK_C
104d0 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f  OLUMN.**       o
104e0 70 65 72 61 6e 64 73 20 63 72 65 61 74 65 64 20  perands created 
104f0 62 79 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  by the constant 
10500 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69  propagation opti
10510 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  mization..**.** 
10520 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
10530 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2c 20  e returns true, 
10540 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  it indicates tha
10550 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
10560 0a 2a 2a 20 63 61 6e 20 62 65 20 61 64 64 65 64  .** can be added
10570 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10580 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74 20  pConstExpr list 
10590 61 6e 64 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  and evaluated on
105a0 63 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ce when.** the p
105b0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
105c0 74 20 73 74 61 72 74 73 20 75 70 2e 20 20 53 65  t starts up.  Se
105d0 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
105e0 65 41 74 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e  eAtInit()..*/.in
105f0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
10600 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
10610 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
10620 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
10630 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
10640 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
10650 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
10660 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
10670 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10680 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
10690 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
106a0 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
106b0 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
106c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
106d0 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
106e0 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
106f0 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
10700 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
10710 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
10720 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
10730 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
10740 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
10750 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
10760 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
10770 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
10780 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a  , 3, iCur);.}...
10790 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
107a0 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
107b0 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
107c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
107d0 47 72 6f 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74  GroupBy()..*/.st
107e0 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
107f0 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  eIsConstantOrGro
10800 75 70 42 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  upBy(Walker *pWa
10810 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
10820 72 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  r){.  ExprList *
10830 70 47 72 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b  pGroupBy = pWalk
10840 65 72 2d 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a  er->u.pGroupBy;.
10850 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43    int i;..  /* C
10860 68 65 63 6b 20 69 66 20 70 45 78 70 72 20 69 73  heck if pExpr is
10870 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e   identical to an
10880 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2e  y GROUP BY term.
10890 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72   If so, consider
108a0 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e  .  ** it constan
108b0 74 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  t.  */.  for(i=0
108c0 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
108d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
108e0 78 70 72 20 2a 70 20 3d 20 70 47 72 6f 75 70 42  xpr *p = pGroupB
108f0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
10900 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10910 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78  prCompare(0, pEx
10920 70 72 2c 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a  pr, p, -1)<2 ){.
10930 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10940 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10950 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c  prNNCollSeq(pWal
10960 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b  ker->pParse, p);
10970 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10980 65 33 49 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c  e3IsBinary(pColl
10990 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
109a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
109b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
109c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
109d0 70 45 78 70 72 20 69 73 20 61 20 73 75 62 2d 73  pExpr is a sub-s
109e0 65 6c 65 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f  elect. If so, co
109f0 6e 73 69 64 65 72 20 69 74 20 76 61 72 69 61 62  nsider it variab
10a00 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  le. */.  if( pEx
10a10 70 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c 65 63  pr->eX==EX_Selec
10a20 74 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  t ){.    pWalker
10a30 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
10a40 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
10a50 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
10a60 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
10a70 61 6e 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ant(pWalker, pEx
10a80 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  pr);.}../*.** Wa
10a90 6c 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  lk the expressio
10aa0 6e 20 74 72 65 65 20 70 61 73 73 65 64 20 61 73  n tree passed as
10ab0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
10ac0 65 6e 74 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ent. Return non-
10ad0 7a 65 72 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65  zero.** if the e
10ae0 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73  xpression consis
10af0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ts entirely of c
10b00 6f 6e 73 74 61 6e 74 73 20 6f 72 20 63 6f 70 69  onstants or copi
10b10 65 73 20 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20  es of terms .** 
10b20 69 6e 20 70 47 72 6f 75 70 42 79 20 74 68 61 74  in pGroupBy that
10b30 20 73 6f 72 74 20 77 69 74 68 20 74 68 65 20 42   sort with the B
10b40 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
10b50 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
10b60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10b70 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
10b80 65 20 69 66 20 61 20 74 65 72 6d 20 6f 66 20 74  e if a term of t
10b90 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
10ba0 20 63 61 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f   can.** be promo
10bb0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 57 48 45  ted into the WHE
10bc0 52 45 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  RE clause.  In o
10bd0 72 64 65 72 20 66 6f 72 20 73 75 63 68 20 61 20  rder for such a 
10be0 70 72 6f 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72  promotion to wor
10bf0 6b 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  k,.** the value 
10c00 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  of the HAVING cl
10c10 61 75 73 65 20 74 65 72 6d 20 6d 75 73 74 20 62  ause term must b
10c20 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
10c30 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a  ll members of.**
10c40 20 61 20 22 67 72 6f 75 70 22 2e 20 20 54 68 65   a "group".  The
10c50 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
10c60 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
10c70 65 72 6d 20 6d 75 73 74 20 62 65 20 42 49 4e 41  erm must be BINA
10c80 52 59 0a 2a 2a 20 61 73 73 75 6d 65 73 20 74 68  RY.** assumes th
10c90 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c  at no other coll
10ca0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77  ating sequence w
10cb0 69 6c 6c 20 68 61 76 65 20 61 20 66 69 6e 65 72  ill have a finer
10cc0 2d 67 72 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75  -grained.** grou
10cd0 70 69 6e 67 20 74 68 61 6e 20 62 69 6e 61 72 79  ping than binary
10ce0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
10cf0 73 20 28 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62  s (A=B COLLATE b
10d00 69 6e 61 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a  inary) implies.*
10d10 2a 20 41 3d 42 20 69 6e 20 65 76 65 72 79 20 6f  * A=B in every o
10d20 74 68 65 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ther collating s
10d30 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 72 65  equence.  The re
10d40 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
10d50 68 65 0a 2a 2a 20 47 52 4f 55 50 20 42 59 20 62  he.** GROUP BY b
10d60 65 20 42 49 4e 41 52 59 20 69 73 20 73 74 72 69  e BINARY is stri
10d70 63 74 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73  cter than necess
10d80 61 72 79 2e 20 20 49 74 20 77 6f 75 6c 64 20 61  ary.  It would a
10d90 6c 73 6f 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70  lso work.** to p
10da0 72 6f 6d 6f 74 65 20 48 41 56 49 4e 47 20 63 6c  romote HAVING cl
10db0 61 75 73 65 73 20 74 68 61 74 20 75 73 65 20 74  auses that use t
10dc0 68 65 20 73 61 6d 65 20 61 6c 74 65 72 6e 61 74  he same alternat
10dd0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  ive collating.**
10de0 20 73 65 71 75 65 6e 63 65 20 61 73 20 74 68 65   sequence as the
10df0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 2c 20   GROUP BY term, 
10e00 62 75 74 20 74 68 61 74 20 69 73 20 6d 75 63 68  but that is much
10e10 20 68 61 72 64 65 72 20 74 6f 20 63 68 65 63 6b   harder to check
10e20 2c 0a 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65  ,.** alternative
10e30 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10e40 6e 63 65 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f  nces are uncommo
10e50 6e 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 6f  n, and this is o
10e60 6e 6c 79 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69  nly an.** optimi
10e70 7a 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61  zation, so we ta
10e80 6b 65 20 74 68 65 20 65 61 73 79 20 77 61 79 20  ke the easy way 
10e90 6f 75 74 20 61 6e 64 20 73 69 6d 70 6c 79 20 72  out and simply r
10ea0 65 71 75 69 72 65 20 74 68 65 0a 2a 2a 20 47 52  equire the.** GR
10eb0 4f 55 50 20 42 59 20 74 6f 20 75 73 65 20 74 68  OUP BY to use th
10ec0 65 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  e BINARY collati
10ed0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
10ee0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
10ef0 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
10f00 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
10f10 2c 20 45 78 70 72 20 2a 70 2c 20 45 78 70 72 4c  , Expr *p, ExprL
10f20 69 73 74 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a  ist *pGroupBy){.
10f30 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
10f40 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
10f50 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
10f60 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
10f70 74 4f 72 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e  tOrGroupBy;.  w.
10f80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
10f90 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75  = 0;.  w.u.pGrou
10fa0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
10fb0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
10fc0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
10fd0 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
10fe0 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
10ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
11000 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
11010 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
11020 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
11030 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
11040 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
11050 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
11060 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
11070 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
11080 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
11090 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
110a0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
110b0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
110c0 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
110d0 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
110e0 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
110f0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
11100 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
11110 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
11120 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
11130 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
11140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11150 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
11160 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
11170 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
11180 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
11190 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
111a0 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
111b0 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
111c0 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
111d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
111e0 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
111f0 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
11200 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
11210 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
11220 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
11230 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
11240 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
11250 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
11260 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
11270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11280 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
11290 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
112a0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
112b0 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
112c0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
112d0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
112e0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
112f0 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
11300 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69  lectWalkFail;.#i
11310 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
11320 47 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  G.  w.xSelectCal
11330 6c 62 61 63 6b 32 20 3d 20 73 71 6c 69 74 65 33  lback2 = sqlite3
11340 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
11350 32 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  2;.#endif.  sqli
11360 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
11370 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
11380 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  Code==0;.}.#endi
11390 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
113a0 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
113b0 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
113c0 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
113d0 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
113e0 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
113f0 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
11400 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
11410 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
11420 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
11430 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
11440 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
11450 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
11460 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
11470 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
11480 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
11490 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
114a0 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
114b0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
114c0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
114d0 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
114e0 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
114f0 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   rc = 0;.  if( p
11500 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
11510 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
11520 70 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 6e  pen following on
11530 20 4f 4f 4d 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66   OOM */..  /* If
11540 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
11550 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
11560 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
11570 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
11580 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
11590 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
115a0 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
115b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
115c0 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
115d0 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
115e0 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
115f0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
11600 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
11610 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
11620 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
11630 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
11640 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11650 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
11660 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
11670 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
11680 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
11690 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
116a0 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
116b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
116c0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
116d0 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
116e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
116f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11700 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
11710 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
11720 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
11730 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
11740 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
11750 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
11760 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
11770 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
11780 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
11790 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
117a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
117b0 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
117c0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
117d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
117e0 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
117f0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
11800 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
11810 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
11820 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
11830 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
11840 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
11850 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11860 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
11870 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
11880 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
11890 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
118a0 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
118b0 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
118c0 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
118d0 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
118e0 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
118f0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
11900 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
11910 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
11920 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
11930 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
11940 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
11950 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
11960 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
11970 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
11980 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
11990 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
119a0 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
119b0 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
119c0 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
119d0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
119e0 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
119f0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
11a00 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
11a10 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
11a20 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
11a30 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
11a40 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11a50 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
11a60 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
11a70 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
11a80 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
11a90 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
11aa0 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
11ab0 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
11ac0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
11ad0 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
11ae0 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
11af0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
11b00 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
11b10 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
11b20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
11b30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
11b40 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
11b50 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
11b60 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73  COLUMN:.      as
11b70 73 65 72 74 28 20 70 2d 3e 65 58 3d 3d 45 58 5f  sert( p->eX==EX_
11b80 54 61 62 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Tab );.      ret
11b90 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
11ba0 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
11bb0 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
11bc0 20 20 20 20 20 70 2d 3e 78 2e 70 54 61 62 3d 3d       p->x.pTab==
11bd0 30 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e  0 ||  /* Referen
11be0 63 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20  ce to column of 
11bf0 69 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73  index on express
11c00 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
11c10 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e      (p->iColumn>
11c20 3d 30 20 26 26 20 70 2d 3e 78 2e 70 54 61 62 2d  =0 && p->x.pTab-
11c30 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
11c40 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
11c50 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
11c60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11c70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c80 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
11c90 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
11ca0 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
11cb0 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
11cc0 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
11cd0 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
11ce0 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
11cf0 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
11d00 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
11d10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
11d20 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
11d30 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
11d40 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
11d50 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
11d60 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
11d70 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
11d80 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
11d90 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
11da0 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
11db0 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
11dc0 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
11dd0 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
11de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11df0 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
11e00 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
11e10 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
11e20 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
11e30 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
11e40 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
11e50 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
11e60 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
11e70 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
11e80 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
11e90 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
11ea0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
11eb0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
11ec0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
11ed0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
11ee0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
11ef0 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
11f00 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
11f10 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
11f20 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
11f30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
11f40 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
11f50 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
11f60 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
11f70 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
11f80 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
11f90 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
11fa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
11fb0 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
11fc0 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
11fd0 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
11fe0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11ff0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12000 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
12010 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
12020 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
12030 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
12040 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
12050 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
12060 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
12070 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
12080 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
12090 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
120a0 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
120b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
120c0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
120d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
120e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
120f0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
12100 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
12110 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
12120 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
12130 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
12140 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
12150 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
12160 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
12170 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
12180 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
12190 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
121a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
121b0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
121c0 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
121d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
121e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
121f0 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  X is the RHS of 
12200 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  an IN operator. 
12210 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45   If pX is a SELE
12220 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
12230 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d   that can be sim
12240 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72  plified to a dir
12250 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73  ect table access
12260 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a  , then return.**
12270 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12280 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
12290 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f  nt.  If pX is no
122a0 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  t a SELECT state
122b0 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  ment,.** or if t
122c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
122d0 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ent needs to be 
122e0 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20  manifested into 
122f0 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74  a transient.** t
12300 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72  able, then retur
12310 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64  n NULL..*/.#ifnd
12320 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12330 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
12340 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
12350 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
12360 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  *pX){.  Select *
12370 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  p;.  SrcList *pS
12380 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
12390 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
123a0 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pTab;.  int i;.
123b0 20 20 69 66 28 20 70 58 2d 3e 65 58 21 3d 45 58    if( pX->eX!=EX
123c0 5f 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  _Select ) return
123d0 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   0;      /* Not 
123e0 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
123f0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
12400 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65  rty(pX, EP_VarSe
12410 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
12420 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
12450 73 75 62 71 20 2a 2f 0a 20 20 7d 0a 20 20 70 20  subq */.  }.  p 
12460 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  = pX->x.pSelect;
12470 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
12480 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
124a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
124b0 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
124c0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
124d0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
124e0 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
124f0 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
12500 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
12510 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
12520 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
12530 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
12540 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
12550 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
12560 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
12570 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
12580 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
12590 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
125a0 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
125b0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
125c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
125d0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
125e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
125f0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
12600 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
12610 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
12620 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12630 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
12640 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
12650 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
12660 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12670 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
12680 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12690 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
126a0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
126b0 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
126c0 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
126d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
126e0 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
126f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
12700 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
12710 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
12720 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
12730 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
12740 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
12750 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
12760 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  .pTab;.  assert(
12770 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
12780 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
12790 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
127a0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
127b0 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
127c0 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
127d0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
127e0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
127f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
12800 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
12810 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
12820 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
12830 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
12840 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54  .  /* All SELECT
12850 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65   results must be
12860 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66   columns. */.  f
12870 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12880 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12890 20 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20     Expr *pRes = 
128a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
128b0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  pr;.    if( pRes
128c0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
128d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
128e0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
128f0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
12900 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
12910 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
12920 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d   subquery */.  }
12930 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
12940 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12950 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12960 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12970 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12980 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12990 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
129a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
129b0 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
129c0 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
129d0 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
129e0 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
129f0 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
12a00 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
12a10 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
12a20 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
12a30 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
12a40 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
12a50 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
12a60 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
12a70 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
12a80 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
12a90 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12aa0 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
12ab0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
12ac0 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
12ad0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
12ae0 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
12af0 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
12b00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12b10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12b20 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
12b30 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
12b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12b50 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
12b60 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
12b70 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
12b80 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12b90 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
12ba0 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
12bb0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12bc0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
12bd0 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
12be0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
12bf0 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
12c00 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
12c10 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12c20 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e  v, addr1);.}.#en
12c30 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
12c40 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12c50 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
12c60 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
12c70 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
12c80 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
12c90 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
12ca0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
12cb0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
12cc0 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
12cd0 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
12ce0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
12cf0 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
12d00 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
12d10 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
12d20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d  ;.  assert( pIn-
12d30 3e 65 58 21 3d 45 58 5f 53 65 6c 65 63 74 20 29  >eX!=EX_Select )
12d40 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e  ;.  pLHS = pIn->
12d50 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c  pLeft;.  pIn->pL
12d60 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d  eft = 0;.  res =
12d70 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
12d80 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70  nstant(pIn);.  p
12d90 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53  In->pLeft = pLHS
12da0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12db0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12dc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12dd0 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
12de0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
12df0 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
12e00 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20  ator..** The pX 
12e10 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
12e20 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74   expression on t
12e30 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12e40 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68   operator, which
12e50 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74  .** might be eit
12e60 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78  her a list of ex
12e70 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73  pressions or a s
12e80 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
12e90 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
12ea0 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e  outine is to fin
12eb0 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
12ec0 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
12ed0 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
12ee0 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
12ef0 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e  or membership in
12f00 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72 20   the RHS set or 
12f10 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
12f20 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72  gh.** all member
12f30 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65 74  s of the RHS set
12f40 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
12f50 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  cates..**.** A c
12f60 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
12f70 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  on the b-tree ob
12f80 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
12f90 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12fa0 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
12fb0 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
12fc0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
12fd0 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
12fe0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
12ff0 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
13000 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
13010 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
13020 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
13030 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
13040 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
13050 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
13060 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
13070 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
13080 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
13090 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
130a0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
130b0 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
130c0 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
130d0 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
130e0 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
130f0 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
13100 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
13110 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
13120 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
13130 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
13140 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
13150 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13170 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
13180 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49  al table..**   I
13190 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20  N_INDEX_NOOP    
131a0 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77     - No cursor w
131b0 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54  as allocated.  T
131c0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  he IN operator m
131d0 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ust be.**       
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73    implemented as
13200 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63   a sequence of c
13210 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a  omparisons..**.*
13220 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d  * An existing b-
13230 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75 73  tree might be us
13240 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65 78  ed if the RHS ex
13250 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61  pression pX is a
13260 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75   simple.** subqu
13270 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a  ery such as:.**.
13280 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
13290 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e  olumn1>, <column
132a0 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c  2>... FROM <tabl
132b0 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
132c0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
132d0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
132e0 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c   or a more compl
132f0 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65  ex subquery, the
13300 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61  n.** an ephemera
13310 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65  l table might ne
13320 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  ed to be generat
13330 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20  ed from the RHS 
13340 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e  and then.** pX->
13350 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70  iTable made to p
13360 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65  oint to the ephe
13370 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
13380 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
13390 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a  sting table..**.
133a0 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70  ** The inFlags p
133b0 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f  arameter must co
133c0 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e 69  ntain, at a mini
133d0 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20  mum, one of the 
133e0 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  bits.** IN_INDEX
133f0 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49  _MEMBERSHIP or I
13400 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75 74  N_INDEX_LOOP but
13410 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20 69   not both.  If i
13420 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 0a  nFlags contains.
13430 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  ** IN_INDEX_MEMB
13440 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68 65  ERSHIP, then the
13450 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
13460 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
13470 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d 62  r a fast.** memb
13480 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57 68  ership test.  Wh
13490 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  en the IN_INDEX_
134a0 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74 2c  LOOP bit is set,
134b0 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77 69   the IN index wi
134c0 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ll.** be used to
134d0 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 76   loop over all v
134e0 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48 53  alues of the RHS
134f0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13500 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  tor..**.** When 
13510 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73  IN_INDEX_LOOP is
13520 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
13530 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
13540 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  ed to iterate.**
13550 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74   through the set
13560 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74   members) then t
13570 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e  he b-tree must n
13580 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69  ot contain dupli
13590 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68  cates..** An eph
135a0 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69 6c  eremal table wil
135b0 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e 6c  l be created unl
135c0 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
135d0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75 61   columns are gua
135e0 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
135f0 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
13600 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
13610 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
13620 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f 0a  Y KEY or due to.
13630 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73  ** a UNIQUE cons
13640 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78 2e  traint or index.
13650 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
13660 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
13670 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
13680 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
13690 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
136a0 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
136b0 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
136c0 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
136d0 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
136e0 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 73   unless <columns
136f0 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49 4e  > is a single IN
13700 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
13710 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20 0a  Y column or an .
13720 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  ** index can be 
13730 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20 73  found with the s
13740 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d 6e  pecified <column
13750 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  s> as its left-m
13760 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
13770 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  e IN_INDEX_NOOP_
13780 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  OK and IN_INDEX_
13790 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20 62  MEMBERSHIP are b
137a0 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20 69  oth set and.** i
137b0 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
137c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
137d0 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
137e0 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68 69  bquery) then thi
137f0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69 67  s.** routine mig
13800 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20 63  ht decide that c
13810 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
13820 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72 20  eral b-tree for 
13830 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74 65  membership.** te
13840 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78 70  sting is too exp
13850 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75 72  ensive and retur
13860 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
13870 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
13880 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  the.** calling r
13890 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69 6d  outine should im
138a0 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20 6f  plement the IN o
138b0 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61 20  perator using a 
138c0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20 45  sequence.** of E
138d0 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69 73  q or Ne comparis
138e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
138f0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
13900 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
13910 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
13920 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
13930 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
13940 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 6b   might need to k
13950 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
13960 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65 20  ot the RHS side 
13970 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
13980 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  or.** contains a
13990 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68 73   NULL.  If prRhs
139a0 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20 61  HasNull is not a
139b0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e   NULL pointer an
139c0 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  d .** if there i
139d0 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61  s any chance tha
139e0 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67 68  t the (...) migh
139f0 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
13a00 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
13a10 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
13a20 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
13a30 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
13a40 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
13a50 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73 48  en.** to *prRhsH
13a60 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72 65  asNull. If there
13a70 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
13a80 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
13a90 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
13aa0 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 52  value, then *prR
13ab0 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65 66  hsHasNull is lef
13ac0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
13ad0 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
13ae0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
13af0 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
13b00 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73 48  tored in *prRhsH
13b10 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20  asNull, then.** 
13b20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 61  the value in tha
13b30 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  t register will 
13b40 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 62  be NULL if the b
13b50 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6f  -tree contains o
13b60 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55  ne or more.** NU
13b70 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20 69  LL values, and i
13b80 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20 6e  t will be some n
13b90 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
13ba0 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74   the b-tree cont
13bb0 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20  ains no.** NULL 
13bc0 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  values..**.** If
13bd0 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61 6d   the aiMap param
13be0 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  eter is not NULL
13bf0 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  , it must point 
13c00 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e 74  to an array cont
13c10 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6c  aining.** one el
13c20 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 63  ement for each c
13c30 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62  olumn returned b
13c40 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
13c50 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52 48  tement on the RH
13c60 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28 2e  S.** of the IN(.
13c70 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54 68  ..) operator. Th
13c80 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66 20  e i'th entry of 
13c90 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f 70  the array is pop
13ca0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ulated with the.
13cb0 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  ** offset of the
13cc0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
13cd0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69  at matches the i
13ce0 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  'th column retur
13cf0 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53 45  ned by the.** SE
13d00 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70 6c  LECT. For exampl
13d10 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  e, if the expres
13d20 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 65  sion and selecte
13d30 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a 0a  d index are:.**.
13d40 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e 20  **   (?,?,?) IN 
13d50 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  (SELECT a, b, c 
13d60 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43 52  FROM t1).**   CR
13d70 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
13d80 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a 2a   t1(b, c, a);.**
13d90 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b 5d  .** then aiMap[]
13da0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
13db0 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a 2f  th {2, 0, 1}..*/
13dc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13dd0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
13de0 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
13df0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
13e00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13e10 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13e20 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
13e30 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pX,            
13e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
13e50 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
13e60 53 29 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  S) of the IN ope
13e70 72 61 74 6f 72 20 2a 2f 0a 20 20 75 33 32 20 69  rator */.  u32 i
13e80 6e 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  nFlags,         
13e90 20 20 20 20 20 20 2f 2a 20 49 4e 5f 49 4e 44 45        /* IN_INDE
13ea0 58 5f 4c 4f 4f 50 2c 20 5f 4d 45 4d 42 45 52 53  X_LOOP, _MEMBERS
13eb0 48 49 50 2c 20 61 6e 64 2f 6f 72 20 5f 4e 4f 4f  HIP, and/or _NOO
13ec0 50 5f 4f 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  P_OK */.  int *p
13ed0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 20 20 20  rRhsHasNull,    
13ee0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13ef0 20 68 6f 6c 64 69 6e 67 20 4e 55 4c 4c 20 73 74   holding NULL st
13f00 61 74 75 73 2e 20 20 53 65 65 20 6e 6f 74 65 73  atus.  See notes
13f10 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70   */.  int *aiMap
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
13f40 20 49 6e 64 65 78 20 66 69 65 6c 64 73 20 74 6f   Index fields to
13f50 20 52 48 53 20 66 69 65 6c 64 73 20 2a 2f 0a 29   RHS fields */.)
13f60 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
13f90 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
13fa0 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
13fb0 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
13fc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
13fe0 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
13ff0 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
14000 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
14010 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
14020 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
14030 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
14040 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
14050 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14070 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
14080 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
14090 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
140a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
140b0 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
140c0 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
140d0 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
140e0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
140f0 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
14100 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
14110 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
14120 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
14130 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
14140 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
14150 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
14160 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
14170 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
14180 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
14190 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
141a0 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
141b0 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
141c0 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
141d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
141e0 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
141f0 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
14200 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
14210 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
14220 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
14230 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
14240 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
14250 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
14260 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
14270 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
14280 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
14290 20 26 26 20 70 58 2d 3e 65 58 3d 3d 45 58 5f 53   && pX->eX==EX_S
142a0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  elect ){.    int
142b0 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   i;.    ExprList
142c0 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d 3e 78   *pEList = pX->x
142d0 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
142e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
142f0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
14300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14310 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
14320 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61 5b 69  Null(pEList->a[i
14330 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65 61 6b  ].pExpr) ) break
14340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14350 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  i==pEList->nExpr
14360 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68 73 48   ){.      prRhsH
14370 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  asNull = 0;.    
14380 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
14390 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
143a0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
143b0 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
143c0 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
143d0 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
143e0 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
143f0 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
14400 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
14410 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f  meral table.  */
14420 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
14430 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d 20 69  Err==0 && (p = i
14440 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
14450 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a 20 20  pt(pX))!=0 ){.  
14460 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14470 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
14480 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
14490 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
144a0 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
144b0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
144d0 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20   Table <table>. 
144e0 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14510 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
14520 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 45 78  r pTab */.    Ex
14530 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
14540 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
14550 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45 4c 69  int nExpr = pELi
14560 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
14570 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14580 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
14590 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
145a0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
145b0 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
145c0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
145d0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
145e0 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
145f0 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
14600 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
14610 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
14620 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
14630 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
14640 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
14650 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
14660 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
14670 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 20 20  a[0].pTab;..    
14680 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
14690 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
146a0 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
146b0 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
146c0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
146d0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
146e0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
146f0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
14700 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
14710 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
14720 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
14730 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
14740 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
14750 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 61 73 73 65  Name);..    asse
14760 72 74 28 76 29 3b 20 20 2f 2a 20 73 71 6c 69 74  rt(v);  /* sqlit
14770 65 33 47 65 74 56 64 62 65 28 29 20 68 61 73 20  e3GetVdbe() has 
14780 61 6c 77 61 79 73 20 62 65 65 6e 20 70 72 65 76  always been prev
14790 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 2a 2f  iously called */
147a0 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d  .    if( nExpr==
147b0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
147c0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
147d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  <0 ){.      /* T
147e0 68 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  he "x IN (SELECT
147f0 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 61 62 6c   rowid FROM tabl
14800 65 29 22 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  e)" case */.    
14810 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
14820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
14830 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 0a 20 20 20  v, OP_Once);.   
14840 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
14850 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
14860 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
14870 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
14880 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
14890 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
148a0 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
148b0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
148c0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
148d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
148e0 22 55 53 49 4e 47 20 52 4f 57 49 44 20 53 45 41  "USING ROWID SEA
148f0 52 43 48 20 4f 4e 20 54 41 42 4c 45 20 25 73 20  RCH ON TABLE %s 
14900 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52 22  FOR IN-OPERATOR"
14910 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  ,pTab->zName));.
14920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14930 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
14940 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
14950 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
14960 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
14970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14980 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
14990 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
149a0 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20 20  inity_ok = 1;.  
149b0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
149c0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
149d0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
149e0 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
149f0 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20 0a  o perform each .
14a00 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69        ** compari
14a10 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  son is the same 
14a20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  as the affinity 
14a30 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69  of each column i
14a40 6e 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  n table.      **
14a50 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
14a60 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20  he IN operator. 
14a70 20 49 66 20 69 74 20 6e 6f 74 2c 20 69 74 20 69   If it not, it i
14a80 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
14a90 6f 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 20 61  o.      ** use a
14aa0 6e 79 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ny index of the 
14ab0 52 48 53 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  RHS table.  */. 
14ac0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14ad0 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74  nExpr && affinit
14ae0 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y_ok; i++){.    
14af0 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
14b00 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
14b10 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70  eldSubexpr(pX->p
14b20 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
14b30 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c    int iCol = pEL
14b40 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
14b50 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
14b60 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20    char idxaff = 
14b70 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
14b80 6d 6e 41 66 66 69 6e 69 74 79 28 70 54 61 62 2c  mnAffinity(pTab,
14b90 69 43 6f 6c 29 3b 20 2f 2a 20 52 48 53 20 74 61  iCol); /* RHS ta
14ba0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
14bb0 68 61 72 20 63 6d 70 61 66 66 20 3d 20 73 71 6c  har cmpaff = sql
14bc0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
14bd0 69 74 79 28 70 4c 68 73 2c 20 69 64 78 61 66 66  ity(pLhs, idxaff
14be0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
14bf0 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c  ase( cmpaff==SQL
14c00 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
14c10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14c20 28 20 63 6d 70 61 66 66 3d 3d 53 51 4c 49 54 45  ( cmpaff==SQLITE
14c30 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
14c40 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 70       switch( cmp
14c50 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  aff ){.         
14c60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
14c70 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20  _BLOB:.         
14c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14c90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14ca0 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  AFF_TEXT:.      
14cb0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
14cc0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
14cd0 29 20 6f 6e 6c 79 20 72 65 74 75 72 6e 73 20 54  ) only returns T
14ce0 45 58 54 20 69 66 20 6f 6e 65 20 73 69 64 65 20  EXT if one side 
14cf0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  or the.         
14d00 20 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 73 20     ** other has 
14d10 6e 6f 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  no affinity and 
14d20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 69  the other side i
14d30 73 20 54 45 58 54 2e 20 20 48 65 6e 63 65 2c 0a  s TEXT.  Hence,.
14d40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
14d50 68 65 20 6f 6e 6c 79 20 77 61 79 20 66 6f 72 20  he only way for 
14d60 63 6d 70 61 66 66 20 74 6f 20 62 65 20 54 45 58  cmpaff to be TEX
14d70 54 20 69 73 20 66 6f 72 20 69 64 78 61 66 66 20  T is for idxaff 
14d80 74 6f 20 62 65 20 54 45 58 54 0a 20 20 20 20 20  to be TEXT.     
14d90 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 66 6f         ** and fo
14da0 72 20 74 68 65 20 74 65 72 6d 20 6f 6e 20 74 68  r the term on th
14db0 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
14dc0 74 6f 20 68 61 76 65 20 6e 6f 20 61 66 66 69 6e  to have no affin
14dd0 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ity. */.        
14de0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 61      assert( idxa
14df0 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
14e00 45 58 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  EXT );.         
14e10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14e20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
14e30 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
14e40 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 73  y_ok = sqlite3Is
14e50 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
14e60 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20  idxaff);.       
14e70 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
14e80 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 5f 6f    if( affinity_o
14e90 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
14ea0 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
14eb0 69 73 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  isting index tha
14ec0 74 20 77 69 6c 6c 20 77 6f 72 6b 20 66 6f 72 20  t will work for 
14ed0 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72  this IN operator
14ee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
14ef0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
14f00 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
14f10 3d 3d 30 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  ==0; pIdx=pIdx->
14f20 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
14f30 20 20 42 69 74 6d 61 73 6b 20 63 6f 6c 55 73 65    Bitmask colUse
14f40 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  d;      /* Colum
14f50 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
14f60 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
14f70 20 20 42 69 74 6d 61 73 6b 20 6d 43 6f 6c 3b 20    Bitmask mCol; 
14f80 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
14f90 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
14fa0 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  column */.      
14fb0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
14fc0 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20 29 20 63 6f  olumn<nExpr ) co
14fd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14fe0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 43 6f    /* Maximum nCo
14ff0 6c 75 6d 6e 20 69 73 20 42 4d 53 2d 32 2c 20 6e  lumn is BMS-2, n
15000 6f 74 20 42 4d 53 2d 31 2c 20 73 6f 20 74 68 61  ot BMS-1, so tha
15010 74 20 77 65 20 63 61 6e 20 63 6f 6d 70 75 74 65  t we can compute
15020 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 42 49  .          ** BI
15030 54 4d 41 53 4b 28 6e 45 78 70 72 29 20 77 69 74  TMASK(nExpr) wit
15040 68 6f 75 74 20 6f 76 65 72 66 6c 6f 77 69 6e 67  hout overflowing
15050 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
15060 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e 43  stcase( pIdx->nC
15070 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 32 20 29 3b 0a  olumn==BMS-2 );.
15080 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
15090 73 65 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  se( pIdx->nColum
150a0 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
150b0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
150c0 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d 53 2d 31 20 29  nColumn>=BMS-1 )
150d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
150e0 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65 55       if( mustBeU
150f0 6e 69 71 75 65 20 29 7b 0a 20 20 20 20 20 20 20  nique ){.       
15100 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
15110 4b 65 79 43 6f 6c 3e 6e 45 78 70 72 0a 20 20 20  KeyCol>nExpr.   
15120 20 20 20 20 20 20 20 20 20 20 7c 7c 28 70 49 64            ||(pId
15130 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 78 70 72  x->nColumn>nExpr
15140 20 26 26 20 21 49 73 55 6e 69 71 75 65 49 6e 64   && !IsUniqueInd
15150 65 78 28 70 49 64 78 29 29 0a 20 20 20 20 20 20  ex(pIdx)).      
15160 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
15170 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
15180 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
15190 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 6f 76  is not unique ov
151a0 65 72 20 74 68 65 20 49 4e 20 52 48 53 20 63 6f  er the IN RHS co
151b0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  lumns */.       
151c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
151d0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
151e0 63 6f 6c 55 73 65 64 20 3d 20 30 3b 20 20 20 2f  colUsed = 0;   /
151f0 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64  * Columns of ind
15200 65 78 20 75 73 65 64 20 73 6f 20 66 61 72 20 2a  ex used so far *
15210 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
15220 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
15230 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
15240 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c  Expr *pLhs = sql
15250 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53  ite3VectorFieldS
15260 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66 74  ubexpr(pX->pLeft
15270 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
15280 20 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70    Expr *pRhs = p
15290 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
152a0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  r;.            C
152b0 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
152c0 71 6c 69 74 65 33 43 6f 6d 70 61 72 69 73 6f 6e  qlite3Comparison
152d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
152e0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
152f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
15300 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61    .            a
15310 73 73 65 72 74 28 20 70 52 65 71 21 3d 30 20 7c  ssert( pReq!=0 |
15320 7c 20 70 52 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d  | pRhs->iColumn=
15330 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 70 50 61  =XN_ROWID || pPa
15340 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 20  rse->nErr );.   
15350 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
15360 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  ; j<nExpr; j++){
15370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
15380 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
15390 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e 69 43 6f 6c  n[j]!=pRhs->iCol
153a0 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
153c0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f  sert( pIdx->azCo
153d0 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 20  ll[j] );.       
153e0 20 20 20 20 20 20 20 69 66 28 20 70 52 65 71 21         if( pReq!
153f0 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
15400 49 43 6d 70 28 70 52 65 71 2d 3e 7a 4e 61 6d 65  ICmp(pReq->zName
15410 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
15420 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
15430 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
15440 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
15450 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
15460 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15480 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
15490 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
154a0 20 20 20 20 6d 43 6f 6c 20 3d 20 4d 41 53 4b 42      mCol = MASKB
154b0 49 54 28 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  IT(j);.         
154c0 20 20 20 69 66 28 20 6d 43 6f 6c 20 26 20 63 6f     if( mCol & co
154d0 6c 55 73 65 64 20 29 20 62 72 65 61 6b 3b 20 2f  lUsed ) break; /
154e0 2a 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 75 73  * Each column us
154f0 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ed only once */.
15500 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55              colU
15510 73 65 64 20 7c 3d 20 6d 43 6f 6c 3b 0a 20 20 20  sed |= mCol;.   
15520 20 20 20 20 20 20 20 20 20 69 66 28 20 61 69 4d           if( aiM
15530 61 70 20 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  ap ) aiMap[i] = 
15540 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  j;.          }. 
15550 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65   .          asse
15560 72 74 28 20 69 3d 3d 6e 45 78 70 72 20 7c 7c 20  rt( i==nExpr || 
15570 63 6f 6c 55 73 65 64 21 3d 28 4d 41 53 4b 42 49  colUsed!=(MASKBI
15580 54 28 6e 45 78 70 72 29 2d 31 29 20 29 3b 0a 20  T(nExpr)-1) );. 
15590 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c           if( col
155a0 55 73 65 64 3d 3d 28 4d 41 53 4b 42 49 54 28 6e  Used==(MASKBIT(n
155b0 45 78 70 72 29 2d 31 29 20 29 7b 0a 20 20 20 20  Expr)-1) ){.    
155c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
155d0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
155e0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
155f0 65 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  e index pIdx is 
15600 75 73 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  usable */.      
15610 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
15620 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15630 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
15640 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ;.            Ex
15660 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
15670 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 20 20 20 20 20 20 20 22 55 53 49 4e 47 20           "USING 
156a0 49 4e 44 45 58 20 25 73 20 46 4f 52 20 49 4e 2d  INDEX %s FOR IN-
156b0 4f 50 45 52 41 54 4f 52 22 2c 70 49 64 78 2d 3e  OPERATOR",pIdx->
156c0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
156d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
156e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
156f0 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
15700 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
15710 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15720 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
15730 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
15740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
15750 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
15760 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
15770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
15780 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
15790 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
157a0 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
157b0 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
157c0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
157d0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
157e0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
157f0 30 5d 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  0];.  .         
15800 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
15810 75 6c 6c 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ull ){.#ifdef SQ
15820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
15830 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20  MN_USED_MASK.   
15840 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
15850 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
15860 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
15870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15880 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
15890 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
158b0 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26  ab, 0, 0, (u8*)&
158c0 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b  mask, P4_INT64);
158d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
158e0 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
158f0 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
15900 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
15910 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
15920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15930 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
15940 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
15950 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
15960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15970 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
15980 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15990 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
159a0 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
159b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
159c0 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
159d0 65 72 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  er indexes */.  
159e0 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28      } /* End if(
159f0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 29 20 2a   affinity_ok ) *
15a00 2f 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 69  /.    } /* End i
15a10 66 20 6e 6f 74 20 61 6e 20 72 6f 77 69 64 20 69  f not an rowid i
15a20 6e 64 65 78 20 2a 2f 0a 20 20 7d 20 2f 2a 20 45  ndex */.  } /* E
15a30 6e 64 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  nd attempt to op
15a40 74 69 6d 69 7a 65 20 75 73 69 6e 67 20 61 6e 20  timize using an 
15a50 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 49  index */..  /* I
15a60 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
15a70 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
15a80 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
15a90 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
15aa0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
15ab0 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
15ac0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
15ad0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
15ae0 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
15af0 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
15b00 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
15b10 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
15b20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65  or has two or fe
15b30 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20  wer terms,.  ** 
15b40 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77  then it is not w
15b50 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e  orth creating an
15b60 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
15b70 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a   to evaluate.  *
15b80 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  * the IN operato
15b90 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49  r so return IN_I
15ba0 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a  NDEX_NOOP..  */.
15bb0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20    if( eType==0. 
15bc0 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20    && (inFlags & 
15bd0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
15be0 29 21 3d 30 0a 20 20 20 26 26 20 70 58 2d 3e 65  )!=0.   && pX->e
15bf0 58 3d 3d 45 58 5f 4c 69 73 74 0a 20 20 20 26 26  X==EX_List.   &&
15c00 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49   (!sqlite3InRhsI
15c10 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c  sConstant(pX) ||
15c20 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pX->x.pList->nE
15c30 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20  xpr<=2).  ){.   
15c40 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
15c50 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  X_NOOP;.  }..  i
15c60 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
15c70 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
15c80 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
15c90 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
15ca0 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
15cb0 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
15cc0 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
15cd0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
15ce0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
15cf0 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
15d00 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
15d10 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
15d20 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
15d30 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
15d40 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
15d50 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
15d60 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
15d70 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
15d80 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
15d90 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
15da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
15db0 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
15dc0 6d 6e 3c 30 20 26 26 20 70 58 2d 3e 65 58 3d 3d  mn<0 && pX->eX==
15dd0 45 58 5f 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  EX_List ){.     
15de0 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
15df0 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
15e00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15e10 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
15e20 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
15e30 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
15e40 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
15e50 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
15e60 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
15e70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
15e80 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
15e90 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
15ea0 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
15eb0 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
15ec0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
15ed0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
15ee0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
15ef0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 69 4d 61  .  }..  if( aiMa
15f00 70 20 26 26 20 65 54 79 70 65 21 3d 49 4e 5f 49  p && eType!=IN_I
15f10 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 26  NDEX_INDEX_ASC &
15f20 26 20 65 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45  & eType!=IN_INDE
15f30 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a  X_INDEX_DESC ){.
15f40 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
15f50 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70    n = sqlite3Exp
15f60 72 56 65 63 74 6f 72 53 69 7a 65 28 70 58 2d 3e  rVectorSize(pX->
15f70 70 4c 65 66 74 29 3b 0a 20 20 20 20 66 6f 72 28  pLeft);.    for(
15f80 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 61  i=0; i<n; i++) a
15f90 69 4d 61 70 5b 69 5d 20 3d 20 69 3b 0a 20 20 7d  iMap[i] = i;.  }
15fa0 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
15fb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
15fc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15fd0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 41 72  UBQUERY./*.** Ar
15fe0 67 75 6d 65 6e 74 20 70 45 78 70 72 20 69 73 20  gument pExpr is 
15ff0 61 6e 20 28 3f 2c 20 3f 2e 2e 2e 29 20 49 4e 28  an (?, ?...) IN(
16000 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e  ...) expression.
16010 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
16020 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
16030 20 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 2d 74   returns a nul-t
16040 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
16050 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20   containing .** 
16060 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 20 74  the affinities t
16070 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 61  o be used for ea
16080 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
16090 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
160a0 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
160b0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
160c0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
160d0 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 74  ure that the ret
160e0 75 72 6e 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  urned.** string 
160f0 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  is eventually fr
16100 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
16110 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  3DbFree()..*/.st
16120 61 74 69 63 20 63 68 61 72 20 2a 65 78 70 72 49  atic char *exprI
16130 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  NAffinity(Parse 
16140 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
16150 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  Expr){.  Expr *p
16160 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
16170 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20  eft;.  int nVal 
16180 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
16190 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
161a0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
161b0 74 20 3d 20 28 70 45 78 70 72 2d 3e 65 58 3d 3d  t = (pExpr->eX==
161c0 45 58 5f 53 65 6c 65 63 74 29 20 3f 20 70 45 78  EX_Select) ? pEx
161d0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20  pr->x.pSelect : 
161e0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
161f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
16200 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
16210 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
16220 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72  DbMallocRaw(pPar
16230 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
16240 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
16250 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
16260 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
16270 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
16280 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63  *pA = sqlite3Vec
16290 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28  torFieldSubexpr(
162a0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
162b0 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65   char a = sqlite
162c0 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41  3ExprAffinity(pA
162d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
162e0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
162f0 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65  zRet[i] = sqlite
16300 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
16310 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  (pSelect->pEList
16320 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29  ->a[i].pExpr, a)
16330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16340 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d         zRet[i] =
16350 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
16360 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d  }.    zRet[nVal]
16370 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72   = '\0';.  }.  r
16380 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
16390 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
163a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
163b0 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  RY./*.** Load th
163c0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  e Parse object p
163d0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
163e0 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  st argument with
163f0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65   an error .** me
16400 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72  ssage of the for
16410 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d  m:.**.**   "sub-
16420 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e  select returns N
16430 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
16440 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69  ted M".*/   .voi
16450 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65  d sqlite3Subsele
16460 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  ctError(Parse *p
16470 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75  Parse, int nActu
16480 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29  al, int nExpect)
16490 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
164a0 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65  zFmt = "sub-sele
164b0 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f  ct returns %d co
164c0 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
164d0 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45   %d";.  sqlite3E
164e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
164f0 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e  zFmt, nActual, n
16500 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69  Expect);.}.#endi
16510 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  f../*.** Express
16520 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76  ion pExpr is a v
16530 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20 62  ector that has b
16540 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63 6f  een used in a co
16550 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20 69  ntext where.** i
16560 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74  t is not permitt
16570 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73 20  ed. If pExpr is 
16580 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65 63  a sub-select vec
16590 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  tor, this routin
165a0 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65 20  e .** loads the 
165b0 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69 74  Parse object wit
165c0 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20 74  h a message of t
165d0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
165e0 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65 74   "sub-select ret
165f0 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d  urns N columns -
16600 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a 0a   expected 1".**.
16610 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20  ** Or, if it is 
16620 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61 72  a regular scalar
16630 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20 20   vector:.**.**  
16640 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
16650 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  sed".*/   .void 
16660 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
16670 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50 61  orMsg(Parse *pPa
16680 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
16690 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
166a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
166b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65 58 3d    if( pExpr->eX=
166c0 3d 45 58 5f 53 65 6c 65 63 74 20 29 7b 0a 20 20  =EX_Select ){.  
166d0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
166e0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
166f0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
16700 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
16710 20 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e   1);.  }else.#en
16720 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
16730 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16740 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
16750 69 73 75 73 65 64 22 29 3b 0a 20 20 7d 0a 7d 0a  isused");.  }.}.
16760 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16770 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
16780 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
16790 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
167a0 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
167b0 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
167c0 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
167d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
167e0 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
167f0 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
16800 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
16810 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
16820 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
16830 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
16840 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
16850 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
16860 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
16870 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
16880 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
16890 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
168a0 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
168b0 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
168c0 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
168d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
168e0 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
168f0 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
16900 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
16910 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
16920 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
16930 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16940 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
16950 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
16960 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
16970 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
16980 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
16990 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
169a0 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
169b0 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
169c0 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
169d0 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
169e0 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
169f0 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
16a00 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
16a10 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
16a20 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
16a30 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
16a40 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
16a50 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
16a60 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
16a70 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
16a80 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
16a90 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
16aa0 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
16ab0 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
16ac0 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
16ad0 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
16ae0 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
16af0 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
16b00 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
16b10 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
16b20 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
16b30 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
16b40 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
16b50 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
16b60 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
16b70 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
16b80 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
16b90 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
16ba0 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
16bb0 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
16bc0 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
16bd0 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
16be0 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
16bf0 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
16c00 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
16c10 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
16c20 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
16c30 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
16c40 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
16c50 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
16c60 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
16c70 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
16c80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
16c90 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
16ca0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
16cb0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
16cc0 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
16cd0 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
16ce0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
16cf0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16d00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16d10 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
16d20 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
16d30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16d40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
16d50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
16d60 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
16d70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
16d80 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
16d90 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
16da0 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
16db0 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
16dc0 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
16dd0 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
16de0 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
16df0 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
16e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16e10 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
16e20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
16e30 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
16e40 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
16e50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16e60 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
16e70 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
16e80 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
16e90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16eb0 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
16ec0 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
16ed0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
16ee0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16ef0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
16f00 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
16f10 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
16f20 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
16f30 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
16f40 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
16f50 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
16f60 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
16f70 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
16f80 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
16f90 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
16fa0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
16fb0 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
16fc0 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
16fd0 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
16fe0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
16ff0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
17000 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
17010 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
17020 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
17030 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
17040 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
17050 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
17060 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
17070 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
17080 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
17090 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
170a0 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
170b0 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
170c0 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
170d0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
170e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
170f0 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
17100 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
17110 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
17120 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
17130 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
17140 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
17150 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
17160 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
17170 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
17180 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
17190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
171a0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
171b0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
171c0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
171d0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
171e0 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74  xpr->pLeft; /* t
171f0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
17200 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
17210 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
17220 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f  Info = 0;      /
17230 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
17240 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
17250 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
17260 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17270 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
17280 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e  /.      .      n
17290 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
172a0 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
172b0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
172c0 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56  ( !isRowid || nV
172d0 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  al==1 );..      
172e0 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
172f0 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
17300 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
17310 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
17320 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
17330 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
17340 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
17350 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
17360 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
17370 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e  * filled with in
17380 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
17390 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
173a0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
173b0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74    ** SELECT or t
173c0 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
173d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
173e0 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
173f0 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
17400 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
17410 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
17420 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
17430 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
17440 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
17450 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
17460 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
17470 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
17480 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
17490 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
174a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
174b0 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
174c0 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
174d0 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
174e0 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
174f0 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
17500 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
17510 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
17520 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
17530 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
17540 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
17550 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
17560 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
17570 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
17580 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
17590 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
175a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
175b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
175c0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
175d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
175e0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
175f0 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  al, .          p
17600 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69  Expr->iTable, (i
17610 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b  sRowid?0:nVal));
17620 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
17630 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
17640 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
17650 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
17660 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20  nVal, 1);..     
17670 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17680 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 7c 7c  eX==EX_Select ||
17690 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c   pExpr->eX==EX_L
176a0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
176b0 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53   pExpr->eX==EX_S
176c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
176d0 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
176e0 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
176f0 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
17700 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
17710 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
17720 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
17730 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
17740 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
17750 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
17760 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
17770 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
17780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
17790 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
177a0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
177b0 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
177c0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
177d0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
177e0 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
177f0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
17800 2c 20 31 2c 20 22 25 73 4c 49 53 54 20 53 55 42  , 1, "%sLIST SUB
17810 51 55 45 52 59 22 2c 0a 20 20 20 20 20 20 20 20  QUERY",.        
17820 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
17830 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
17840 45 44 20 22 0a 20 20 20 20 20 20 20 20 29 29 3b  ED ".        ));
17850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17860 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
17870 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c       /* If the L
17880 48 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68  HS and RHS of th
17890 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f  e IN operator do
178a0 20 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74   not match, that
178b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  .        ** erro
178c0 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
178d0 20 63 61 75 67 68 74 20 6c 6f 6e 67 20 62 65 66   caught long bef
178e0 6f 72 65 20 77 65 20 72 65 61 63 68 20 74 68 69  ore we reach thi
178f0 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20  s point. */.    
17900 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
17910 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 56  EList->nExpr==nV
17920 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
17930 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17940 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
17950 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  i;.          sql
17960 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17970 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
17980 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
17990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 73  );.          des
179a0 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70  t.zAffSdst = exp
179b0 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72  rINAffinity(pPar
179c0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
179d0 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
179e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
179f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17a00 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
17a10 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
17a20 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
17a30 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
17a40 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
17a50 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
17a60 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
17a70 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
17a80 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17a90 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
17aa0 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
17ab0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
17ac0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
17ad0 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
17ae0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17af0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
17b00 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
17b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17b20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
17b40 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
17b50 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
17b60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17b70 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
17b80 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
17b90 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
17ba0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
17bb0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17bc0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
17bd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17be0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
17bf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
17c00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17c10 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17c20 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
17c30 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17c40 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
17c50 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
17c60 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
17c70 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
17c80 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
17c90 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
17ca0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
17cb0 65 33 43 6f 6d 70 61 72 69 73 6f 6e 43 6f 6c 6c  e3ComparisonColl
17cc0 53 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20  Seq(.           
17cd0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20       pParse, p, 
17ce0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
17cf0 70 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  pr.            )
17d00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
17d20 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
17d30 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  Expr->x.pList!=0
17d40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
17d50 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
17d60 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
17d70 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
17d80 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
17d90 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
17da0 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
17db0 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
17dc0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
17dd0 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
17de0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
17df0 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
17e00 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
17e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
17e20 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
17e30 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
17e40 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
17e50 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
17e60 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
17e70 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
17e80 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
17e90 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
17ea0 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
17eb0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
17ec0 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
17ed0 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20  he IN */.       
17ee0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
17ef0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
17f00 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17f10 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
17f20 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17f30 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
17f40 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20  nt r1, r2, r3;. 
17f50 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
17f60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
17f70 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20  inity(pLeft);.  
17f80 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
17f90 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
17fa0 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
17fb0 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
17fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17fd0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
17fe0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17ff0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
18000 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
18010 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
18020 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
18030 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
18040 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
18050 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
18060 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18070 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
18080 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
18090 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
180a0 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
180b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
180c0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
180d0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
180e0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
180f0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
18100 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
18110 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
18120 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 32 2c   OP_Blob, 0, r2,
18130 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49   0, "", P4_STATI
18140 43 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  C);.        for(
18150 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
18160 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
18170 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
18180 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
18190 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
181a0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
181b0 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
181c0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
181d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
181e0 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
181f0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
18200 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
18210 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
18220 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
18230 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
18240 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
18250 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
18260 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
18270 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
18280 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
18290 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
182a0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
182b0 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
182c0 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
182d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
182e0 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
182f0 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20  IfDynamic>=0 && 
18300 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
18310 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
18320 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18330 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
18340 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  op(v, jmpIfDynam
18350 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ic);.           
18360 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
18370 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
18380 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
18390 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
183a0 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
183b0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
183c0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
183d0 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
183e0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
183f0 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
18400 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
18410 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18420 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18430 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
18440 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
18450 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
18460 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18470 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
18480 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
18490 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
184a0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
184b0 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
184d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
184e0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
184f0 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18520 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
18530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
18540 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18570 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
18580 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
18590 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  2, r3);.        
185a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
185b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
185c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
185d0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
185e0 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
185f0 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
18600 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18610 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
18620 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
18630 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
18640 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
18650 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
18660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18670 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18680 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18690 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
186a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
186b0 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
186c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
186d0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
186e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
186f0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
18700 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49  r, (void *)pKeyI
18710 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
18720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18730 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18740 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
18750 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
18760 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c  LECT:.    defaul
18770 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  t: {.      /* Ca
18780 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54  se 3:    (SELECT
18790 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
187a0 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20       **     or: 
187b0 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54     EXISTS(SELECT
187c0 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
187d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
187e0 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
187f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
18800 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
18810 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
18820 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
18830 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e  irst row into an
18840 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
18850 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ers and return t
18860 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20  he index of.    
18870 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
18880 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a  egister..      *
18890 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
188a0 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
188b0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
188c0 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
188d0 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
188e0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72       ** into a r
188f0 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75  egister and retu
18900 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  rn that register
18910 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a   number..      *
18920 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f  *.      ** In bo
18930 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75  th cases, the qu
18940 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64  ery is augmented
18950 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e   with "LIMIT 1".
18960 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20    Any .      ** 
18970 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
18980 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
18990 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
189a0 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20  ew LIMIT 1..    
189b0 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
189c0 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
189f0 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
18a00 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
18a10 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a30 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
18a40 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
18a50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65  */.      int nRe
18a60 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a80 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61  * Registers to a
18a90 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 20  llocate */.     
18aa0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6c 69         /* New li
18ad0 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  mit expression *
18ae0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
18af0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
18b00 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
18b10 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
18b20 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
18b30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18b40 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
18b50 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
18b60 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
18b70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18b80 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 53 65 6c  Expr->eX==EX_Sel
18b90 65 63 74 20 29 3b 0a 0a 20 20 20 20 20 20 70 53  ect );..      pS
18ba0 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
18bb0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
18bc0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
18bd0 50 61 72 73 65 2c 20 31 2c 20 22 25 73 53 43 41  Parse, 1, "%sSCA
18be0 4c 41 52 20 53 55 42 51 55 45 52 59 22 2c 0a 20  LAR SUBQUERY",. 
18bf0 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66             jmpIf
18c00 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43  Dynamic>=0?"":"C
18c10 4f 52 52 45 4c 41 54 45 44 20 22 29 29 3b 0a 20  ORRELATED "));. 
18c20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78 70       nReg = pExp
18c30 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
18c40 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d   ? pSel->pEList-
18c50 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20 20  >nExpr : 1;.    
18c60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18c70 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
18c80 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  , pParse->nMem+1
18c90 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
18ca0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
18cb0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18cc0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
18cd0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
18ce0 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
18cf0 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73         dest.iSds
18d00 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  t = dest.iSDParm
18d10 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 6e  ;.        dest.n
18d20 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20  Sdst = nReg;.   
18d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
18d50 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61  l, 0, dest.iSDPa
18d60 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  rm, dest.iSDParm
18d70 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20 20  +nReg-1);.      
18d80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18d90 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79  , "Init subquery
18da0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
18db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18dc0 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
18dd0 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20  T_Exists;.      
18de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18df0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
18e00 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61  r, 0, dest.iSDPa
18e10 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
18e20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
18e30 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
18e40 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
18e50 20 20 20 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69     pLimit = sqli
18e60 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
18e70 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45  rse->db, TK_INTE
18e80 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e 74 54  GER,&sqlite3IntT
18e90 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20  okens[1], 0);.  
18ea0 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c      if( pSel->pL
18eb0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
18ec0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
18ed0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
18ee0 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
18ef0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  t);.        pSel
18f00 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20  ->pLimit->pLeft 
18f10 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
18f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
18f30 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
18f40 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
18f50 65 2c 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69  e, TK_LIMIT, pLi
18f60 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  mit, 0);.      }
18f70 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
18f80 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
18f90 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
18fa0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
18fb0 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
18fc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18fd0 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
18fe0 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
18ff0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
19000 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
19010 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
19020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19030 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75   }..  if( rHasNu
19040 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  llFlag ){.    sq
19050 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
19060 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54  lag(v, pExpr->iT
19070 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c  able, rHasNullFl
19080 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ag);.  }..  if( 
19090 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
190a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
190b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
190c0 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d  pIfDynamic);.  }
190d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
190e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
190f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19100 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
19110 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
19120 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49  RY./*.** Expr pI
19130 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  n is an IN(...) 
19140 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
19150 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
19160 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75   that the .** su
19170 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20  b-select on the 
19180 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
19190 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65  operator has the
191a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
191b0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74  .** columns as t
191c0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
191d0 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65   LHS. Or, if the
191e0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
191f0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75   is not .** a su
19200 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68  b-query, that th
19210 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f  e LHS is a vecto
19220 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a  r of size 1..*/.
19230 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
19240 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50  heckIN(Parse *pP
19250 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29  arse, Expr *pIn)
19260 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20  {.  int nVector 
19270 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
19280 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65  torSize(pIn->pLe
19290 66 74 29 3b 0a 20 20 69 66 28 20 70 49 6e 2d 3e  ft);.  if( pIn->
192a0 65 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 29 7b  eX==EX_Select ){
192b0 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72  .    if( nVector
192c0 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  !=pIn->x.pSelect
192d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
192e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
192f0 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
19300 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70 53  Parse, pIn->x.pS
19310 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
19320 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b 0a  Expr, nVector);.
19330 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19340 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
19350 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b 0a  ( nVector!=1 ){.
19360 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f      sqlite3Vecto
19370 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  rErrorMsg(pParse
19380 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20  , pIn->pLeft);. 
19390 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
193a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
193b0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
193c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
193d0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
193e0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49  te code for an I
193f0 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  N expression..**
19400 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53  .**      x IN (S
19410 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20  ELECT ...).**   
19420 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20     x IN (value, 
19430 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  value, ...).**.*
19440 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  * The left-hand 
19450 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20  side (LHS) is a 
19460 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f 72  scalar or vector
19470 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
19480 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
19490 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20 61   side (RHS) is a
194a0 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
194b0 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20 76  or more scalar v
194c0 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20 73  alues, or a.** s
194d0 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  ubquery.  If the
194e0 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75 65   RHS is a subque
194f0 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ry, the number o
19500 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
19510 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20 74   must.** match t
19520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
19530 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63 74  umns in the vect
19540 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 20  or on the LHS.  
19550 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a 2a  If the RHS is.**
19560 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
19570 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74 20  s, the LHS must 
19580 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a 2a  be a scalar. .**
19590 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72 61  .** The IN opera
195a0 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20 74  tor is true if t
195b0 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73 20  he LHS value is 
195c0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
195d0 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68 65   the RHS..** The
195e0 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65   result is false
195f0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 64   if the LHS is d
19600 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69 6e  efinitely not in
19610 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 0a   the RHS.  The .
19620 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  ** result is NUL
19630 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e 63  L if the presenc
19640 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20  e of the LHS in 
19650 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20 62  the RHS cannot b
19660 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  e .** determined
19670 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a 2a   due to NULLs..*
19680 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19690 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
196a0 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64   that jumps to d
196b0 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
196c0 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
196d0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
196e0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
196f0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
19700 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
19710 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
19720 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
19730 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
19740 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
19750 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
19760 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
19770 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
19780 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a  all through..**.
19790 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61 72  ** See the separ
197a0 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e  ate in-operator.
197b0 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  md documentation
197c0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61 6e   file in the can
197d0 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65  onical.** SQLite
197e0 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f 72   source tree for
197f0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
19800 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
19810 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
19820 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
19830 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
19840 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
19850 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
19860 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
19870 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
19880 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
19890 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
198a0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
198b0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
198c0 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
198d0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
198e0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
198f0 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
19900 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
19910 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
19920 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
19930 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
19940 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
19950 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
19960 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
19970 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
19980 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
19990 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
199a0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
199b0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
199c0 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lhs;            
199d0 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29 20   /* Register(s) 
199e0 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53 20  holding the LHS 
199f0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
19a00 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20 20  rLhsOrig;       
19a10 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73 20    /* LHS values 
19a20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65 72  prior to reorder
19a30 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20 2a  ing by aiMap[] *
19a40 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
19a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
19a60 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
19a70 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
19a80 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20  nt *aiMap = 0;  
19a90 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d       /* Map from
19aa0 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f   vector field to
19ab0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f   index column */
19ac0 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20  .  char *zAff = 
19ad0 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69  0;       /* Affi
19ae0 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20  nity string for 
19af0 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20  comparisons */. 
19b00 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20   int nVector;   
19b10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19b20 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68  f vectors for th
19b30 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  is IN operator *
19b40 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b 20  /.  int iDummy; 
19b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d            /* Dum
19b60 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  my parameter to 
19b70 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 29  exprCodeVector()
19b80 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
19b90 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
19ba0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
19bb0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
19bc0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
19bd0 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75       /* loop cou
19be0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65  nter */.  int de
19bf0 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20 20  stStep2;        
19c00 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
19c10 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65 6e   when NULLs seen
19c20 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20 20   in step 2 */.  
19c30 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d 20  int destStep6 = 
19c40 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  0;    /* Start o
19c50 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70 20  f code for Step 
19c60 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  6 */.  int addrT
19c70 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a 20  ruthOp;      /* 
19c80 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f 64  Address of opcod
19c90 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  e that determine
19ca0 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75 65  s the IN is true
19cb0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e 6f   */.  int destNo
19cc0 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 4a  tNull;      /* J
19cd0 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63 6f  ump here if a co
19ce0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20  mparison is not 
19cf0 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20 2a  true in step 6 *
19d00 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
19d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
19d20 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20 6c   of the step-6 l
19d30 6f 6f 70 20 2a 2f 20 0a 0a 20 20 70 4c 65 66 74  oop */ ..  pLeft
19d40 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
19d50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
19d60 70 72 43 68 65 63 6b 49 4e 28 70 50 61 72 73 65  prCheckIN(pParse
19d70 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72  , pExpr) ) retur
19d80 6e 3b 0a 20 20 7a 41 66 66 20 3d 20 65 78 70 72  n;.  zAff = expr
19d90 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  INAffinity(pPars
19da0 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 6e 56 65  e, pExpr);.  nVe
19db0 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78  ctor = sqlite3Ex
19dc0 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
19dd0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69  pr->pLeft);.  ai
19de0 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  Map = (int*)sqli
19df0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
19e00 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
19e10 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65  b, nVector*(size
19e20 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
19e30 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b  (char)) + 1.  );
19e40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19e50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19e60 29 20 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78  ) goto sqlite3Ex
19e70 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
19e80 6f 72 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  or;..  /* Attemp
19e90 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  t to compute the
19ea0 20 52 48 53 2e 20 41 66 74 65 72 20 74 68 69 73   RHS. After this
19eb0 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74 68 69   step, if anythi
19ec0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20  ng other than.  
19ed0 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  ** IN_INDEX_NOOP
19ee0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
19ef0 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64 20 69  e table opened i
19f00 74 68 20 63 75 72 73 6f 72 20 70 45 78 70 72 2d  th cursor pExpr-
19f10 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  >iTable .  ** co
19f20 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
19f30 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
19f40 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f 49 4e  he RHS. If IN_IN
19f50 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
19f60 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 52  rned,.  ** the R
19f70 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  HS has not yet b
19f80 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f 0a 20  een coded.  */. 
19f90 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
19fa0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
19fb0 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
19fc0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
19fd0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
19fe0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
19ff0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
1a000 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
1a010 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
1a020 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
1a030 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
1a060 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
1a070 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
1a0a0 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
1a0b0 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
1a0c0 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a  asNull, aiMap);.
1a0d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1a0e0 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65 63 74  e->nErr || nVect
1a0f0 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65 3d 3d  or==1 || eType==
1a100 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20 20 20  IN_INDEX_EPH.   
1a110 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e      || eType==IN
1a120 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
1a130 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   || eType==IN_IN
1a140 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 0a  DEX_INDEX_DESC .
1a150 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49    );.#ifdef SQLI
1a160 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 43 6f  TE_DEBUG.  /* Co
1a170 6e 66 69 72 6d 20 74 68 61 74 20 61 69 4d 61 70  nfirm that aiMap
1a180 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 56 65 63  [] contains nVec
1a190 74 6f 72 20 69 6e 74 65 67 65 72 20 76 61 6c 75  tor integer valu
1a1a0 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
1a1b0 0a 20 20 2a 2a 20 6e 56 65 63 74 6f 72 2d 31 2e  .  ** nVector-1.
1a1c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1a1d0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1a1e0 20 20 20 20 69 6e 74 20 6a 2c 20 63 6e 74 3b 0a      int j, cnt;.
1a1f0 20 20 20 20 66 6f 72 28 63 6e 74 3d 6a 3d 30 3b      for(cnt=j=0;
1a200 20 6a 3c 6e 56 65 63 74 6f 72 3b 20 6a 2b 2b 29   j<nVector; j++)
1a210 20 69 66 28 20 61 69 4d 61 70 5b 6a 5d 3d 3d 69   if( aiMap[j]==i
1a220 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 61 73   ) cnt++;.    as
1a230 73 65 72 74 28 20 63 6e 74 3d 3d 31 20 29 3b 0a  sert( cnt==1 );.
1a240 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a250 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
1a260 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
1a270 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
1a280 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  . If the LHS is 
1a290 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20  a .  ** vector, 
1a2a0 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65  then it is store
1a2b0 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  d in an array of
1a2c0 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65   nVector registe
1a2d0 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a  rs starting .  *
1a2e0 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2a 0a 20 20  * at r1..  **.  
1a2f0 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  ** sqlite3FindIn
1a300 49 6e 64 65 78 28 29 20 6d 69 67 68 74 20 68 61  Index() might ha
1a310 76 65 20 72 65 6f 72 64 65 72 65 64 20 74 68 65  ve reordered the
1a320 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4c   fields of the L
1a330 48 53 20 76 65 63 74 6f 72 0a 20 20 2a 2a 20 73  HS vector.  ** s
1a340 6f 20 74 68 61 74 20 74 68 65 20 66 69 65 6c 64  o that the field
1a350 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d  s are in the sam
1a360 65 20 6f 72 64 65 72 20 61 73 20 61 6e 20 65 78  e order as an ex
1a370 69 73 74 69 6e 67 20 69 6e 64 65 78 2e 20 20 20  isting index.   
1a380 54 68 65 0a 20 20 2a 2a 20 61 69 4d 61 70 5b 5d  The.  ** aiMap[]
1a390 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
1a3a0 61 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  a mapping from t
1a3b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 4c 48 53 20  he original LHS 
1a3c0 66 69 65 6c 64 20 6f 72 64 65 72 20 74 6f 0a 20  field order to. 
1a3d0 20 2a 2a 20 74 68 65 20 66 69 65 6c 64 20 6f 72   ** the field or
1a3e0 64 65 72 20 74 68 61 74 20 6d 61 74 63 68 65 73  der that matches
1a3f0 20 74 68 65 20 52 48 53 20 69 6e 64 65 78 2e 0a   the RHS index..
1a400 20 20 2a 2f 0a 20 20 72 4c 68 73 4f 72 69 67 20    */.  rLhsOrig 
1a410 3d 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72  = exprCodeVector
1a420 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1a430 26 69 44 75 6d 6d 79 29 3b 0a 20 20 66 6f 72 28  &iDummy);.  for(
1a440 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 20 26  i=0; i<nVector &
1a450 26 20 61 69 4d 61 70 5b 69 5d 3d 3d 69 3b 20 69  & aiMap[i]==i; i
1a460 2b 2b 29 7b 7d 20 2f 2a 20 41 72 65 20 4c 48 53  ++){} /* Are LHS
1a470 20 66 69 65 6c 64 73 20 72 65 6f 72 64 65 72 65   fields reordere
1a480 64 3f 20 2a 2f 0a 20 20 69 66 28 20 69 3d 3d 6e  d? */.  if( i==n
1a490 56 65 63 74 6f 72 20 29 7b 0a 20 20 20 20 2f 2a  Vector ){.    /*
1a4a0 20 4c 48 53 20 66 69 65 6c 64 73 20 61 72 65 20   LHS fields are 
1a4b0 6e 6f 74 20 72 65 6f 72 64 65 72 65 64 20 2a 2f  not reordered */
1a4c0 0a 20 20 20 20 72 4c 68 73 20 3d 20 72 4c 68 73  .    rLhs = rLhs
1a4d0 4f 72 69 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Orig;.  }else{. 
1a4e0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
1a4f0 6f 72 64 65 72 20 74 68 65 20 4c 48 53 20 66 69  order the LHS fi
1a500 65 6c 64 73 20 61 63 63 6f 72 64 69 6e 67 20 74  elds according t
1a510 6f 20 61 69 4d 61 70 20 2a 2f 0a 20 20 20 20 72  o aiMap */.    r
1a520 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Lhs = sqlite3Get
1a530 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1a540 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
1a550 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74  for(i=0; i<nVect
1a560 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
1a570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a580 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4c  3(v, OP_Copy, rL
1a590 68 73 4f 72 69 67 2b 69 2c 20 72 4c 68 73 2b 61  hsOrig+i, rLhs+a
1a5a0 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  iMap[i], 0);.   
1a5b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1a5c0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
1a5d0 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
1a5e0 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
1a5f0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
1a600 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
1a610 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
1a620 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
1a630 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
1a640 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
1a650 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
1a660 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
1a670 20 73 74 65 70 20 28 31 29 20 69 6e 20 74 68 65   step (1) in the
1a680 20 69 6e 2d 6f 70 65 72 61 74 6f 72 2e 6d 64 20   in-operator.md 
1a690 6f 70 74 69 6d 69 7a 65 64 20 61 6c 67 6f 72 69  optimized algori
1a6a0 74 68 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  thm..  */.  if( 
1a6b0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a6c0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
1a6d0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
1a6e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1a6f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1a700 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a710 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
1a720 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1a730 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
1a740 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1a750 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
1a760 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
1a770 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
1a780 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
1a790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1a7a0 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69 73 74  xpr->eX==EX_List
1a7b0 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
1a7c0 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
1a7d0 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
1a7e0 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
1a7f0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1a800 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1a810 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a820 50 5f 42 69 74 41 6e 64 2c 20 72 4c 68 73 2c 20  P_BitAnd, rLhs, 
1a830 72 4c 68 73 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  rLhs, regCkNull)
1a840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1a850 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
1a860 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1a870 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1a880 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1a890 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
1a8a0 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
1a8b0 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
1a8c0 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
1a8d0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
1a8e0 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
1a8f0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1a900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a910 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
1a920 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
1a930 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
1a940 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
1a950 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
1a960 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
1a970 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
1a980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a990 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
1a9a0 2c 20 72 4c 68 73 2c 20 6c 61 62 65 6c 4f 6b 2c  , rLhs, labelOk,
1a9b0 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a9d0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1a9e0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
1a9f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1aa00 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
1aa10 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
1aa20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1aa30 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
1aa40 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
1aa50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1aa60 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a  P5(v, zAff[0]);.
1aa70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1aa80 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
1aa90 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
1aaa0 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20  alse );.        
1aab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aac0 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 4c 68 73  4(v, OP_Ne, rLhs
1aad0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
1aae0 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
1ab00 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
1ab10 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65  LLSEQ); VdbeCove
1ab20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1ab30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1ab40 67 65 50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20  geP5(v, zAff[0] 
1ab50 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
1ab60 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
1ab70 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1ab80 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1ab90 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
1aba0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
1abb0 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
1abc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1abd0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1abe0 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
1abf0 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
1ac00 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
1ac10 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1ac20 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1ac30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ac40 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1ac50 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
1ac60 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1ac70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1ac80 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
1ac90 67 6f 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72  goto sqlite3Expr
1aca0 43 6f 64 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b  CodeIN_finished;
1acb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20  .  }..  /* Step 
1acc0 32 3a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  2: Check to see 
1acd0 69 66 20 74 68 65 20 4c 48 53 20 63 6f 6e 74 61  if the LHS conta
1ace0 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 63 6f 6c  ins any NULL col
1acf0 75 6d 6e 73 2e 20 20 49 66 20 74 68 65 0a 20 20  umns.  If the.  
1ad00 2a 2a 20 4c 48 53 20 64 6f 65 73 20 63 6f 6e 74  ** LHS does cont
1ad10 61 69 6e 20 4e 55 4c 4c 73 20 74 68 65 6e 20 74  ain NULLs then t
1ad20 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
1ad30 65 20 65 69 74 68 65 72 20 46 41 4c 53 45 20 6f  e either FALSE o
1ad40 72 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 20 57 65 20  r NULL..  ** We 
1ad50 77 69 6c 6c 20 74 68 65 6e 20 73 6b 69 70 20 74  will then skip t
1ad60 68 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  he binary search
1ad70 20 6f 66 20 74 68 65 20 52 48 53 2e 0a 20 20 2a   of the RHS..  *
1ad80 2f 0a 20 20 69 66 28 20 64 65 73 74 49 66 4e 75  /.  if( destIfNu
1ad90 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
1ada0 29 7b 0a 20 20 20 20 64 65 73 74 53 74 65 70 32  ){.    destStep2
1adb0 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1adc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 73    }else{.    des
1add0 74 53 74 65 70 32 20 3d 20 64 65 73 74 53 74 65  tStep2 = destSte
1ade0 70 36 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p6 = sqlite3Vdbe
1adf0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ae00 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
1ae10 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
1ae20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
1ae30 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
1ae40 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
1ae50 66 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ft, i);.    if( 
1ae60 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
1ae70 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20  Null(p) ){.     
1ae80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ae90 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
1aea0 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 53 74 65   rLhs+i, destSte
1aeb0 70 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p2);.      VdbeC
1aec0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1aed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70  }.  }..  /* Step
1aee0 20 33 2e 20 20 54 68 65 20 4c 48 53 20 69 73 20   3.  The LHS is 
1aef0 6e 6f 77 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20  now known to be 
1af00 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 44 6f 20 74 68  non-NULL.  Do th
1af10 65 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 0a  e binary search.
1af20 20 20 2a 2a 20 6f 66 20 74 68 65 20 52 48 53 20    ** of the RHS 
1af30 75 73 69 6e 67 20 74 68 65 20 4c 48 53 20 61 73  using the LHS as
1af40 20 61 20 70 72 6f 62 65 2e 20 20 49 66 20 66 6f   a probe.  If fo
1af50 75 6e 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  und, the result 
1af60 69 73 0a 20 20 2a 2a 20 74 72 75 65 2e 0a 20 20  is.  ** true..  
1af70 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1af80 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
1af90 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
1afa0 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
1afb0 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
1afc0 61 62 6c 65 20 62 2d 74 72 65 65 20 61 6e 64 20  able b-tree and 
1afd0 73 6f 20 77 65 20 61 6c 73 6f 0a 20 20 20 20 2a  so we also.    *
1afe0 2a 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  * know that the 
1aff0 52 48 53 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e  RHS is non-NULL.
1b000 20 20 48 65 6e 63 65 2c 20 77 65 20 63 6f 6d 62    Hence, we comb
1b010 69 6e 65 20 73 74 65 70 73 20 33 20 61 6e 64 20  ine steps 3 and 
1b020 34 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20  4.    ** into a 
1b030 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 2a  single opcode. *
1b040 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1b050 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
1b060 65 6b 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e  ekRowid, pExpr->
1b070 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
1b080 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20 20 20  lse, rLhs);.    
1b090 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b0a0 0a 20 20 20 20 61 64 64 72 54 72 75 74 68 4f 70  .    addrTruthOp
1b0b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b0c0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
1b0d0 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54 72 75  ;  /* Return Tru
1b0e0 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
1b0f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b100 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1b110 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63 74 6f  ty, rLhs, nVecto
1b120 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
1b130 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 64 65  tor);.    if( de
1b140 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
1b150 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2f  fNull ){.      /
1b160 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70 20 33  * Combine Step 3
1b170 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e 74 6f   and Step 5 into
1b180 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65   a single opcode
1b190 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b1a0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1b1b0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
1b1c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
1b1d0 73 74 49 66 46 61 6c 73 65 2c 0a 20 20 20 20 20  stIfFalse,.     
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1f0 20 20 20 20 20 20 72 4c 68 73 2c 20 6e 56 65 63        rLhs, nVec
1b200 74 6f 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  tor); VdbeCovera
1b210 67 65 28 76 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge(v);.      got
1b220 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
1b230 65 49 4e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  eIN_finished;.  
1b240 20 20 7d 0a 20 20 20 20 2f 2a 20 4f 72 64 69 6e    }.    /* Ordin
1b250 61 72 79 20 53 74 65 70 20 33 2c 20 66 6f 72 20  ary Step 3, for 
1b260 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 46  the case where F
1b270 41 4c 53 45 20 61 6e 64 20 4e 55 4c 4c 20 61 72  ALSE and NULL ar
1b280 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
1b290 20 20 61 64 64 72 54 72 75 74 68 4f 70 20 3d 20    addrTruthOp = 
1b2a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b2b0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
1b2c0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1b2d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1b300 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1b310 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1b320 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1b330 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1b340 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1b350 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1b360 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1b370 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1b380 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1b390 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1b3a0 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1b3b0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1b3c0 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1b3d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b3e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1b3f0 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1b400 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1b410 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1b420 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1b430 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1b440 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1b450 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1b460 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1b470 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1b480 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1b490 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1b4a0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1b4b0 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1b4c0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1b4d0 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1b4e0 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1b4f0 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1b500 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1b510 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1b520 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1b530 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1b540 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1b550 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1b560 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1b570 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1b580 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1b590 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1b5a0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1b5b0 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1b5c0 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1b5d0 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1b5e0 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1b5f0 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1b600 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1b610 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b620 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1b630 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1b640 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1b650 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1b660 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
1b670 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
1b680 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
1b690 76 29 3b 0a 20 20 69 66 28 20 6e 56 65 63 74 6f  v);.  if( nVecto
1b6a0 72 3e 31 20 29 7b 0a 20 20 20 20 64 65 73 74 4e  r>1 ){.    destN
1b6b0 6f 74 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  otNull = sqlite3
1b6c0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b6d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1b6e0 2a 20 46 6f 72 20 6e 56 65 63 74 6f 72 3d 3d 31  * For nVector==1
1b6f0 2c 20 63 6f 6d 62 69 6e 65 20 73 74 65 70 73 20  , combine steps 
1b700 36 20 61 6e 64 20 37 20 62 79 20 69 6d 6d 65 64  6 and 7 by immed
1b710 69 61 74 65 6c 79 20 72 65 74 75 72 6e 69 6e 67  iately returning
1b720 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66  .    ** FALSE if
1b730 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   the first compa
1b740 72 69 73 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  rison is not NUL
1b750 4c 20 2a 2f 0a 20 20 20 20 64 65 73 74 4e 6f 74  L */.    destNot
1b760 4e 75 6c 6c 20 3d 20 64 65 73 74 49 66 46 61 6c  Null = destIfFal
1b770 73 65 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  se;.  }.  for(i=
1b780 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b  0; i<nVector; i+
1b790 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
1b7a0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
1b7b0 6f 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 33 20  oll;.    int r3 
1b7c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1b7d0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1b7e0 20 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74   p = sqlite3Vect
1b7f0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
1b800 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 70 43  Left, i);.    pC
1b810 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1b820 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1b830 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
1b840 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1b850 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
1b860 69 54 61 62 6c 65 2c 20 69 2c 20 72 33 29 3b 0a  iTable, i, r3);.
1b870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b880 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
1b890 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e 6f 74 4e  rLhs+i, destNotN
1b8a0 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  ull, r3,.       
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b8c0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
1b8d0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 56 64  COLLSEQ);.    Vd
1b8e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b8f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1b900 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b910 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   r3);.  }.  sqli
1b920 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b930 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1b940 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69 66 28 20  tIfNull);.  if( 
1b950 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  nVector>1 ){.   
1b960 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b970 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1b980 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  NotNull);.    sq
1b990 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b9a0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70  v, OP_Next, pExp
1b9b0 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 54  r->iTable, addrT
1b9c0 6f 70 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43  op+1);.    VdbeC
1b9d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
1b9e0 20 2f 2a 20 53 74 65 70 20 37 3a 20 20 49 66 20   /* Step 7:  If 
1b9f0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1ba00 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61  int, we know tha
1ba10 74 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73  t the result mus
1ba20 74 0a 20 20 20 20 2a 2a 20 62 65 20 66 61 6c 73  t.    ** be fals
1ba30 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1ba40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ba50 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
1ba60 66 46 61 6c 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  fFalse);.  }..  
1ba70 2f 2a 20 4a 75 6d 70 73 20 68 65 72 65 20 69 6e  /* Jumps here in
1ba80 20 6f 72 64 65 72 20 74 6f 20 72 65 74 75 72 6e   order to return
1ba90 20 74 72 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   true. */.  sqli
1baa0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1bab0 76 2c 20 61 64 64 72 54 72 75 74 68 4f 70 29 3b  v, addrTruthOp);
1bac0 0a 0a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  ..sqlite3ExprCod
1bad0 65 49 4e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  eIN_finished:.  
1bae0 69 66 28 20 72 4c 68 73 21 3d 72 4c 68 73 4f 72  if( rLhs!=rLhsOr
1baf0 69 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  ig ) sqlite3Rele
1bb00 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1bb10 65 2c 20 72 4c 68 73 29 3b 0a 20 20 56 64 62 65  e, rLhs);.  Vdbe
1bb20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
1bb30 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 73 71 6c   IN expr"));.sql
1bb40 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 6f  ite3ExprCodeIN_o
1bb50 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  om_error:.  sqli
1bb60 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1bb70 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20  ->db, aiMap);.  
1bb80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1bb90 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
1bba0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1bbb0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1bbc0 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
1bbd0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1bbe0 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
1bbf0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
1bc00 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
1bc10 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
1bc20 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
1bc30 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
1bc40 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1bc50 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1bc60 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
1bc70 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
1bc80 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
1bc90 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
1bca0 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
1bcb0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
1bcc0 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
1bcd0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
1bce0 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
1bcf0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
1bd00 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
1bd10 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
1bd20 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
1bd30 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1bd40 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
1bd50 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
1bd60 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
1bd70 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
1bd80 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
1bd90 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
1bda0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
1bdb0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1bdc0 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
1bdd0 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
1bde0 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
1bdf0 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
1be00 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
1be10 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
1be20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
1be30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1be40 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
1be50 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1be60 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
1be70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
1be80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1be90 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
1bea0 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
1beb0 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
1bec0 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
1bed0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
1bee0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
1bef0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
1bf00 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
1bf10 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
1bf20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1bf30 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
1bf40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1bf50 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
1bf60 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
1bf70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1bf80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1bf90 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1bfa0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
1bfb0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
1bfc0 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
1bfd0 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
1bfe0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
1bff0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
1c000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c010 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1c020 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
1c030 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
1c040 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
1c050 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c060 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1c070 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
1c080 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
1c090 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
1c0a0 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
1c0b0 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 33 20 26  .    if( (c==3 &
1c0c0 26 20 21 6e 65 67 46 6c 61 67 29 20 7c 7c 20 28  & !negFlag) || (
1c0d0 63 3d 3d 32 29 20 7c 7c 20 28 6e 65 67 46 6c 61  c==2) || (negFla
1c0e0 67 20 26 26 20 76 61 6c 75 65 3d 3d 53 4d 41 4c  g && value==SMAL
1c0f0 4c 45 53 54 5f 49 4e 54 36 34 29 29 7b 0a 23 69  LEST_INT64)){.#i
1c100 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1c110 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1c120 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c130 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
1c140 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
1c150 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1c160 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
1c170 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53  .#else.#ifndef S
1c180 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
1c190 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28  NTEGER.      if(
1c1a0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1c1b0 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29  p(z,"0x",2)==0 )
1c1c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c1d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c1e0 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74  , "hex literal t
1c1f0 6f 6f 20 62 69 67 3a 20 25 73 25 73 22 2c 20 6e  oo big: %s%s", n
1c200 65 67 46 6c 61 67 3f 22 2d 22 3a 22 22 2c 7a 29  egFlag?"-":"",z)
1c210 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
1c220 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
1c230 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1c240 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
1c250 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  m);.      }.#end
1c260 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1c270 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
1c280 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 33 20  ){ value = c==3 
1c290 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
1c2a0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
1c2b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c2c0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
1c2d0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
1c2e0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
1c2f0 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 0a  4_INT64);.    }.
1c300 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72    }.}.../* Gener
1c310 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1c320 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67  ll load into reg
1c330 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76  ister regOut a v
1c340 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  alue that is.** 
1c350 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
1c360 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63  the iIdxCol-th c
1c370 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
1c380 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Idx..*/.void sql
1c390 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64  ite3ExprCodeLoad
1c3a0 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50  IndexColumn(.  P
1c3b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f  arse *pParse,  /
1c3c0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1c3d0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
1c3e0 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68   *pIdx,    /* Th
1c3f0 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f  e index whose co
1c400 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f  lumn is to be lo
1c410 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  aded */.  int iT
1c420 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72  abCur,    /* Cur
1c430 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1c440 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20  a table row */. 
1c450 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20   int iIdxCol,   
1c460 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
1c470 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62  f the index to b
1c480 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
1c490 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
1c4a0 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78   Store the index
1c4b0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
1c4c0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1c4d0 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43  /.){.  i16 iTabC
1c4e0 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
1c4f0 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20  umn[iIdxCol];.  
1c500 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f  if( iTabCol==XN_
1c510 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65  EXPR ){.    asse
1c520 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
1c530 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  pr );.    assert
1c540 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
1c550 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20  ->nExpr>iIdxCol 
1c560 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
1c570 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75  SelfTab = iTabCu
1c580 72 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  r + 1;.    sqlit
1c590 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
1c5a0 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f  Parse, pIdx->aCo
1c5b0 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c  lExpr->a[iIdxCol
1c5c0 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29  ].pExpr, regOut)
1c5d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
1c5e0 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d 65  elfTab = 0;.  }e
1c5f0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1c600 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1c610 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d  nOfTable(pParse-
1c620 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54  >pVdbe, pIdx->pT
1c630 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20  able, iTabCur,. 
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f     iTabCol, regO
1c670 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1c680 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c690 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1c6a0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
1c6b0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
1c6c0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
1c6d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
1c6e0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
1c6f0 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
1c700 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
1c710 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1c720 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1c730 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
1c740 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1c750 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
1c760 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
1c770 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
1c780 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
1c790 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
1c7a0 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
1c7b0 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
1c7c0 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
1c7d0 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
1c7e0 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
1c7f0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1c800 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
1c810 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
1c820 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
1c830 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c840 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c850 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c 20 69 43  umn, iTabCur, iC
1c860 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20  ol, regOut);.   
1c870 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
1c880 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
1c890 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
1c8a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c8b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
1c8c0 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
1c8d0 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
1c8e0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
1c8f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
1c900 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
1c910 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
1c920 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
1c930 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1c940 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
1c950 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20  Tab) ){.      x 
1c960 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
1c970 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72  fIndex(sqlite3Pr
1c980 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
1c990 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ab), iCol);.    
1c9a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1c9b0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
1c9c0 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75  TabCur, x, regOu
1c9d0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
1c9e0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
1c9f0 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
1ca00 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
1ca10 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
1ca20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1ca30 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1ca40 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
1ca50 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
1ca60 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
1ca70 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
1ca80 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
1ca90 67 69 73 74 65 72 20 69 52 65 67 2e 20 0a 2a 2a  gister iReg. .**
1caa0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1cab0 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
1cac0 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
1cad0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1cae0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
1caf0 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
1cb00 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
1cb10 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
1cb20 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
1cb30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1cb40 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1cb50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cb60 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
1cb70 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1cb80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1cb90 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
1cba0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1cbb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
1cbc0 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
1cbd0 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
1cbe0 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
1cbf0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
1cc00 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
1cc10 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
1cc20 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
1cc30 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
1cc40 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
1cc50 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
1cc60 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
1cc70 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
1cc80 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
1cc90 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41   OP_Column + FLA
1cca0 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  GS */.){.  Vdbe 
1ccb0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1ccc0 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
1ccd0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1cce0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1ccf0 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
1cd00 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
1cd10 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70  , iReg);.  if( p
1cd20 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  5 ){.    sqlite3
1cd30 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1cd40 70 35 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p5);.  }.  retur
1cd50 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
1cd60 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cd70 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
1cd80 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
1cd90 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
1cda0 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
1cdb0 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a  o..iTo+nReg-1..*
1cdc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1cdd0 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
1cde0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1cdf0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
1ce00 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72  t nReg){.  asser
1ce10 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
1ce20 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
1ce30 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
1ce40 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
1ce50 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
1ce60 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
1ce70 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nReg);.}../*.**
1ce80 20 43 6f 6e 76 65 72 74 20 61 20 73 63 61 6c 61   Convert a scala
1ce90 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  r expression nod
1cea0 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
1ceb0 45 52 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  ER referencing.*
1cec0 2a 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  * register iReg.
1ced0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73    The caller mus
1cee0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 52  t ensure that iR
1cef0 65 67 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  eg already conta
1cf00 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ins.** the corre
1cf10 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  ct value for the
1cf20 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1cf30 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1cf40 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
1cf50 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
1cf60 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
1cf70 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
1cf80 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
1cf90 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
1cfa0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
1cfb0 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
1cfc0 2f 2a 0a 2a 2a 20 45 76 61 6c 75 61 74 65 20 61  /*.** Evaluate a
1cfd0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 69  n expression (ei
1cfe0 74 68 65 72 20 61 20 76 65 63 74 6f 72 20 6f 72  ther a vector or
1cff0 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
1d000 73 69 6f 6e 29 20 61 6e 64 20 73 74 6f 72 65 0a  sion) and store.
1d010 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ** the result in
1d020 20 63 6f 6e 74 69 6e 67 75 6f 75 73 20 74 65 6d   continguous tem
1d030 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1d040 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1d050 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  dex of.** the fi
1d060 72 73 74 20 72 65 67 69 73 74 65 72 20 75 73 65  rst register use
1d070 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  d to store the r
1d080 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  esult..**.** If 
1d090 74 68 65 20 72 65 74 75 72 6e 65 64 20 72 65 73  the returned res
1d0a0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1d0b0 61 20 74 65 6d 70 6f 72 61 72 79 20 73 63 61 6c  a temporary scal
1d0c0 61 72 2c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  ar, then also wr
1d0d0 69 74 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 69  ite.** that regi
1d0e0 73 74 65 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ster number into
1d0f0 20 2a 70 69 46 72 65 65 61 62 6c 65 2e 20 20 49   *piFreeable.  I
1d100 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 72  f the returned r
1d110 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 0a 2a  esult register.*
1d120 2a 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  * is not a tempo
1d130 72 61 72 79 20 6f 72 20 69 66 20 74 68 65 20 65  rary or if the e
1d140 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
1d150 65 63 74 6f 72 20 73 65 74 20 2a 70 69 46 72 65  ector set *piFre
1d160 65 61 62 6c 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a  eable.** to 0..*
1d170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1d180 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
1d190 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1d1a0 2a 70 2c 20 69 6e 74 20 2a 70 69 46 72 65 65 61  *p, int *piFreea
1d1b0 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 73  ble){.  int iRes
1d1c0 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75  ult;.  int nResu
1d1d0 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
1d1e0 56 65 63 74 6f 72 53 69 7a 65 28 70 29 3b 0a 20  VectorSize(p);. 
1d1f0 20 69 66 28 20 6e 52 65 73 75 6c 74 3d 3d 31 20   if( nResult==1 
1d200 29 7b 0a 20 20 20 20 69 52 65 73 75 6c 74 20 3d  ){.    iResult =
1d210 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d220 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Temp(pParse, p, 
1d230 70 69 46 72 65 65 61 62 6c 65 29 3b 0a 20 20 7d  piFreeable);.  }
1d240 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 46 72 65  else{.    *piFre
1d250 65 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 69  eable = 0;.    i
1d260 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  f( p->op==TK_SEL
1d270 45 43 54 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ECT ){.#if SQLIT
1d280 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1d290 20 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20        iResult = 
1d2a0 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  0;.#else.      i
1d2b0 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
1d2c0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
1d2d0 61 72 73 65 2c 20 70 2c 20 30 2c 20 30 29 3b 0a  arse, p, 0, 0);.
1d2e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1d2f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d300 20 20 20 20 20 69 52 65 73 75 6c 74 20 3d 20 70       iResult = p
1d310 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1d320 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1d330 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 3b 0a 20 20  m += nResult;.  
1d340 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d350 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
1d360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d370 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
1d380 70 50 61 72 73 65 2c 20 70 2d 3e 78 2e 70 4c 69  pParse, p->x.pLi
1d390 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1d3a0 69 2b 69 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  i+iResult);.    
1d3b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1d3c0 72 65 74 75 72 6e 20 69 52 65 73 75 6c 74 3b 0a  return iResult;.
1d3d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
1d3e0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
1d3f0 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
1d400 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
1d410 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1d420 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
1d430 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1d440 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
1d450 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
1d460 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
1d470 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
1d480 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
1d490 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
1d4a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
1d4b0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
1d4c0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
1d4d0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
1d4e0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
1d4f0 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
1d500 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
1d510 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
1d520 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
1d530 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
1d540 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
1d550 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
1d560 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
1d570 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
1d580 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
1d590 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
1d5a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d5b0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
1d5c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1d5d0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1d5e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1d5f0 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
1d600 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
1d610 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1d620 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1d630 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1d640 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
1d650 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
1d660 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
1d670 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
1d680 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
1d690 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
1d6a0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
1d6b0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
1d6c0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
1d6d0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1d6e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d6f0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
1d700 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
1d710 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
1d720 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
1d730 69 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20  int r1, r2;     
1d740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
1d750 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
1d760 6d 62 65 72 73 20 2a 2f 0a 20 20 45 78 70 72 20  mbers */.  Expr 
1d770 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20  tempX;          
1d780 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
1d790 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  y expression nod
1d7a0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20  e */.  int p5 = 
1d7b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  0;..  assert( ta
1d7c0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1d7d0 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1d7e0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
1d7f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1d800 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d810 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
1d820 72 6e 20 30 3b 0a 20 20 7d 0a 0a 65 78 70 72 5f  rn 0;.  }..expr_
1d830 63 6f 64 65 5f 64 6f 6f 76 65 72 3a 0a 20 20 69  code_doover:.  i
1d840 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
1d850 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
1d860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
1d870 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1d880 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
1d890 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
1d8a0 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
1d8b0 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
1d8c0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
1d8d0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
1d8e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1d8f0 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
1d900 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
1d910 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
1d920 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
1d930 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
1d940 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
1d950 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
1d960 20 72 65 74 75 72 6e 20 70 43 6f 6c 2d 3e 69 4d   return pCol->iM
1d970 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  em;.      }else 
1d980 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
1d990 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
1d9a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d9b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1d9c0 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
1d9d0 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c  >sortingIdxPTab,
1d9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1da00 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1da10 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1da20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1da30 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1da40 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1da50 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
1da60 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
1da70 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
1da80 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1da90 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
1daa0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1dab0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1dac0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1dad0 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29  , EP_FixedCol) )
1dae0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1daf0 73 20 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  s COLUMN express
1db00 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
1db10 63 6f 6e 73 74 61 6e 74 20 64 75 65 20 74 6f 20  constant due to 
1db20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
1db30 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1db40 6e 74 73 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  nts, and that co
1db50 6e 73 74 61 6e 74 20 69 73 20 63 6f 64 65 64 20  nstant is coded 
1db60 62 79 20 74 68 65 20 70 45 78 70 72 2d 3e 70 4c  by the pExpr->pL
1db70 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  eft.        ** e
1db80 78 70 72 65 73 73 73 69 6f 6e 2e 20 20 48 6f 77  xpresssion.  How
1db90 65 76 65 72 2c 20 6d 61 6b 65 20 73 75 72 65 20  ever, make sure 
1dba0 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 68 61 73  the constant has
1dbb0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1dbc0 20 20 20 20 20 2a 2a 20 64 61 74 61 74 79 70 65       ** datatype
1dbd0 20 62 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65   by applying the
1dbe0 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   Affinity of the
1dbf0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 6f   table column to
1dc00 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1dc10 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 20 20 20 20  constant..      
1dc20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
1dc30 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e   aff;.        in
1dc40 74 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33  t iReg = sqlite3
1dc50 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1dc60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1dc70 65 66 74 2c 74 61 72 67 65 74 29 3b 0a 20 20 20  eft,target);.   
1dc80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1dc90 70 72 2d 3e 65 58 3d 3d 45 58 5f 54 61 62 20 29  pr->eX==EX_Tab )
1dca0 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d 20  ;.        aff = 
1dcb0 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
1dcc0 6d 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  mnAffinity(pExpr
1dcd0 2d 3e 78 2e 70 54 61 62 2c 20 70 45 78 70 72 2d  ->x.pTab, pExpr-
1dce0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1dcf0 20 20 20 69 66 28 20 61 66 66 21 3d 53 51 4c 49     if( aff!=SQLI
1dd00 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20  TE_AFF_BLOB ){. 
1dd10 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
1dd20 63 6f 6e 73 74 20 63 68 61 72 20 7a 41 66 66 5b  const char zAff[
1dd30 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30 30 30 44  ] = "B\000C\000D
1dd40 5c 30 30 30 45 22 3b 0a 20 20 20 20 20 20 20 20  \000E";.        
1dd50 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
1dd60 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41 27 20 29  _AFF_BLOB=='A' )
1dd70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1dd80 72 74 28 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  rt( SQLITE_AFF_T
1dd90 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20 20 20 20  EXT=='B' );.    
1dda0 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
1ddb0 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
1ddc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ddd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
1dde0 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65  opy, iReg, targe
1ddf0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1de00 69 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  iReg = target;. 
1de10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1de20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1de30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
1de40 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 31 2c 20  inity, iReg, 1, 
1de50 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1de70 7a 41 66 66 5b 28 61 66 66 2d 27 42 27 29 2a 32  zAff[(aff-'B')*2
1de80 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
1de90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dea0 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 20 20   return iReg;.  
1deb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1dec0 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
1ded0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 53    if( pParse->iS
1dee0 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  elfTab<0 ){.    
1def0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1df00 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
1df10 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
1df20 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
1df30 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
1df40 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d     return pExpr-
1df50 3e 69 43 6f 6c 75 6d 6e 20 2d 20 70 50 61 72 73  >iColumn - pPars
1df60 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20  e->iSelfTab;.   
1df70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1df80 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20        /* Coding 
1df90 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1dfa0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1dfb0 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c   index where col
1dfc0 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20  umn names.      
1dfd0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1dfe0 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65  dex refer to the
1dff0 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
1e000 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
1e010 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
1e020 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  Tab = pParse->iS
1e030 65 6c 66 54 61 62 20 2d 20 31 3b 0a 20 20 20 20  elfTab - 1;.    
1e040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e050 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1e060 72 2d 3e 65 58 3d 3d 45 58 5f 54 61 62 20 29 3b  r->eX==EX_Tab );
1e070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1e080 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1e090 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1e0a0 45 78 70 72 2d 3e 78 2e 70 54 61 62 2c 0a 20 20  Expr->x.pTab,.  
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1e0d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
1e0e0 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1e110 3e 6f 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op2);.    }.   
1e120 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1e130 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
1e140 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
1e150 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
1e160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e170 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rget;.    }.    
1e180 63 61 73 65 20 54 4b 5f 54 52 55 45 46 41 4c 53  case TK_TRUEFALS
1e190 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1e1a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e1b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 71 6c 69  OP_Integer, sqli
1e1c0 74 65 33 45 78 70 72 54 72 75 74 68 56 61 6c 75  te3ExprTruthValu
1e1d0 65 28 70 45 78 70 72 29 2c 20 74 61 72 67 65 74  e(pExpr), target
1e1e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e1f0 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69  target;.    }.#i
1e200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e210 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1e220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
1e230 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
1e240 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e250 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e260 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e270 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
1e280 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1e290 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e2a0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1e2b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e2c0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
1e2d0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e2e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e2f0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1e300 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
1e310 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
1e320 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
1e330 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1e340 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  ;.      return t
1e350 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arget;.    }.   
1e360 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
1e370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1e390 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
1e3a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1e3b0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rget;.    }.#ifn
1e3c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e3d0 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
1e3e0 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
1e3f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
1e400 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e410 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
1e420 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
1e430 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1e440 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1e450 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1e460 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e470 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78  >u.zToken[0]=='x
1e480 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ' || pExpr->u.zT
1e490 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  oken[0]=='X' );.
1e4a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1e4b0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
1e4c0 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
1e4d0 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54  z = &pExpr->u.zT
1e4e0 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e  oken[2];.      n
1e4f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1e500 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20  30(z) - 1;.     
1e510 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27   assert( z[n]=='
1e520 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c  \'' );.      zBl
1e530 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
1e540 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
1e550 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
1e560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e570 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
1e580 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
1e590 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
1e5a0 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  AMIC);.      ret
1e5b0 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20  urn target;.    
1e5c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1e5d0 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
1e5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1e5f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e600 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1e610 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1e620 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e630 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
1e640 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e650 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
1e660 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e680 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
1e690 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
1e6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
1e6b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
1e6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
1e6d0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1e6e0 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e  lite3VListNumToN
1e6f0 61 6d 65 28 70 50 61 72 73 65 2d 3e 70 56 4c 69  ame(pParse->pVLi
1e700 73 74 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  st, pExpr->iColu
1e710 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  mn);.        ass
1e720 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1e730 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 7c 7c 20  oken[0]=='?' || 
1e740 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  strcmp(pExpr->u.
1e750 7a 54 6f 6b 65 6e 2c 20 7a 29 3d 3d 30 20 29 3b  zToken, z)==0 );
1e760 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1e770 3e 70 56 4c 69 73 74 5b 30 5d 20 3d 20 30 3b 20  >pVList[0] = 0; 
1e780 2f 2a 20 49 6e 64 69 63 61 74 65 20 56 4c 69 73  /* Indicate VLis
1e790 74 20 6d 61 79 20 6e 6f 20 6c 6f 6e 67 65 72 20  t may no longer 
1e7a0 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
1e7b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e7c0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 63  beAppendP4(v, (c
1e7d0 68 61 72 2a 29 7a 2c 20 50 34 5f 53 54 41 54 49  har*)z, P4_STATI
1e7e0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
1e7f0 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1e800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e810 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1e820 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70       return pExp
1e830 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 7d  r->iTable;.    }
1e840 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e850 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
1e860 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
1e870 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1e880 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
1e890 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
1e8a0 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
1e8b0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1e8c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1e8d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e8e0 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
1e8f0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1e900 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
1e910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e920 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1e930 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
1e940 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
1e950 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
1e960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73  AddOp2(v, OP_Cas
1e980 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  t, target,.     
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69     sqlite3Affini
1e9b0 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
1e9c0 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  zToken, 0));.   
1e9d0 20 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b     return inReg;
1e9e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1e9f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1ea00 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
1ea10 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1ea20 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70  _ISNOT:.      op
1ea30 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1ea40 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1ea50 20 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54        p5 = SQLIT
1ea60 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
1ea70 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  /* fall-through 
1ea80 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
1ea90 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1eaa0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1eab0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1eac0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1ead0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1eae0 51 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  Q: {.      Expr 
1eaf0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
1eb00 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28  pLeft;.      if(
1eb10 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1eb20 63 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20  ctor(pLeft) ){. 
1eb30 20 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f         codeVecto
1eb40 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
1eb50 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1eb60 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d  op, p5);.      }
1eb70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1eb80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1eb90 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1eba0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1ebb0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1ebc0 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f  ( pExpr->eX==EX_
1ebd0 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20  Right );.       
1ebe0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ebf0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ec00 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  , pExpr->x.pRigh
1ec10 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1ec20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
1ec30 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1ec40 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  , pExpr->x.pRigh
1ec50 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1ec60 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
1ec70 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
1ec80 20 7c 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20   | p5);.        
1ec90 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
1eca0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
1ecb0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
1ecc0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ecd0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Lt);.        
1ece0 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
1ecf0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
1ed00 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
1ed10 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ed20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Le);.        
1ed30 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
1ed40 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
1ed50 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
1ed60 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ed70 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20  OP_Gt);.        
1ed80 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1ed90 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1eda0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1edb0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1edc0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ge);.        
1edd0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1ede0 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1edf0 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1ee00 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ee10 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20  OP_Eq);.        
1ee20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
1ee30 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
1ee40 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
1ee50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ee60 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ne);.        
1ee70 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ee80 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1ee90 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1eea0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1eeb0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1eec0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1eed0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
1eee0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
1eef0 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
1ef00 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
1ef10 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
1ef20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
1ef30 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
1ef40 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1ef50 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
1ef60 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
1ef70 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
1ef80 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
1ef90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
1efa0 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
1efb0 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
1efc0 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
1efd0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1efe0 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
1eff0 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
1f000 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
1f010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1f020 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
1f030 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
1f040 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
1f050 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f060 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
1f070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1f080 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
1f090 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
1f0a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
1f0b0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
1f0c0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
1f0d0 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
1f0e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f0f0 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
1f100 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
1f110 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
1f120 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f130 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
1f140 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f150 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
1f160 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
1f170 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
1f180 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f190 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
1f1a0 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
1f1b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
1f1c0 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
1f1d0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
1f1e0 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
1f1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1f200 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
1f210 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
1f220 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
1f230 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
1f240 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
1f250 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f260 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
1f270 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
1f280 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f290 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
1f2a0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f2b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f2c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f2d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f2e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f2f0 65 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a  eX==EX_Right );.
1f300 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1f310 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f320 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e  Parse, pExpr->x.
1f330 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1f340 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1f350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1f360 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1f370 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1f380 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f390 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f3a0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1f3b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f3c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f3d0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1f3e0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1f3f0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1f400 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1f410 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1f420 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1f430 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1f440 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1f450 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1f460 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  get);.        re
1f470 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23 69 66  turn target;.#if
1f480 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f490 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1f4a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f4b0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
1f4c0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
1f4d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f4e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1f4f0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1f500 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1f510 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
1f520 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
1f530 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1f540 61 72 67 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  arget;.#endif.  
1f550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f560 20 20 20 6d 65 6d 73 65 74 28 26 74 65 6d 70 58     memset(&tempX
1f570 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 65 6d 70  , 0, sizeof(temp
1f580 58 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  X));.        tem
1f590 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  pX.op = TK_INTEG
1f5a0 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ER;.        temp
1f5b0 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74  X.flags = EP_Int
1f5c0 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  Value|EP_TokenOn
1f5d0 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ly;.        temp
1f5e0 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a  X.u.iValue = 0;.
1f5f0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1f600 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f610 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c  (pParse, &tempX,
1f620 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f630 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1f640 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f650 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f660 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
1f670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f680 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1f690 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
1f6a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f6b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f6c0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1f6d0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1f6e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f6f0 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
1f700 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1f710 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
1f720 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
1f730 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1f740 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
1f750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f760 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
1f770 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1f780 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
1f790 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f7a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f7b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f7c0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f7d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f7e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f7f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f800 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1f810 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
1f820 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f830 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48     case TK_TRUTH
1f840 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  : {.      int is
1f850 54 72 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54  True;    /* IS T
1f860 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52  RUE or IS NOT TR
1f870 55 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  UE */.      int 
1f880 62 4e 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53  bNormal;   /* IS
1f890 20 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53   TRUE or IS FALS
1f8a0 45 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20  E */.      r1 = 
1f8b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f8c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f8d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f8e0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1f8f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f900 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1f910 74 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58  t( pExpr->eX==EX
1f920 5f 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  _Right );.      
1f930 69 73 54 72 75 65 20 3d 20 73 71 6c 69 74 65 33  isTrue = sqlite3
1f940 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
1f950 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 29 3b  Expr->x.pRight);
1f960 0a 20 20 20 20 20 20 62 4e 6f 72 6d 61 6c 20 3d  .      bNormal =
1f970 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f   pExpr->op2==TK_
1f980 49 53 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  IS;.      testca
1f990 73 65 28 20 69 73 54 72 75 65 20 26 26 20 62 4e  se( isTrue && bN
1f9a0 6f 72 6d 61 6c 29 3b 0a 20 20 20 20 20 20 74 65  ormal);.      te
1f9b0 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20  stcase( !isTrue 
1f9c0 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20  && bNormal);.   
1f9d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f9e0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 73  dOp4Int(v, OP_Is
1f9f0 54 72 75 65 2c 20 72 31 2c 20 69 6e 52 65 67 2c  True, r1, inReg,
1fa00 20 21 69 73 54 72 75 65 2c 20 69 73 54 72 75 65   !isTrue, isTrue
1fa10 20 5e 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20 20 20   ^ bNormal);.   
1fa20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fa30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1fa40 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1fa50 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1fa60 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1fa70 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1fa80 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1fa90 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1faa0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1fab0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1fac0 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1fad0 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
1fae0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1faf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fb00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1fb10 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
1fb20 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
1fb30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fb40 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fb50 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1fb60 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1fb70 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1fb80 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
1fb90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1fba0 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
1fbb0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fbc0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
1fbd0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
1fbe0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fbf0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
1fc00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1fc10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1fc20 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
1fc30 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1fc40 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1fc50 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
1fc60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fc70 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1fc80 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
1fc90 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
1fca0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1fcb0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
1fcc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1fcd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1fce0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1fcf0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1fd00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1fd10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
1fd20 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
1fd30 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
1fd40 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1fd50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fd60 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 2d 3e 61   return pInfo->a
1fd70 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
1fd80 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
1fd90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fda0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
1fdb0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1fdc0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
1fdd0 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
1fde0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1fdf0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
1fe00 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
1fe10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fe20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1fe30 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
1fe40 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
1fe50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
1fe60 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
1fe70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
1fe80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
1fe90 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
1fea0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1feb0 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
1fec0 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
1fed0 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
1fee0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
1fef0 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
1ff00 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1ff30 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ff40 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1ff50 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1ff60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1ff70 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
1ff80 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54  C(db);      /* T
1ff90 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
1ffa0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61   used by this da
1ffb0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
1ffc0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1ffd0 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c   0;    /* A coll
1ffe0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
1fff0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
20000 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
20010 43 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  C.      if( !Exp
20020 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20030 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
20040 7c 45 50 5f 52 65 64 75 63 65 64 29 20 26 26 20  |EP_Reduced) && 
20050 70 45 78 70 72 2d 3e 70 57 69 6e 20 29 7b 0a 20  pExpr->pWin ){. 
20060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45         return pE
20070 78 70 72 2d 3e 70 57 69 6e 2d 3e 72 65 67 52 65  xpr->pWin->regRe
20080 73 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 23 65  sult;.      }.#e
20090 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
200a0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
200b0 61 72 73 65 29 20 26 26 20 73 71 6c 69 74 65 33  arse) && sqlite3
200c0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
200d0 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a  tJoin(pExpr) ){.
200e0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 66          /* SQL f
200f0 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20  unctions can be 
20100 65 78 70 65 6e 73 69 76 65 2e 20 53 6f 20 74 72  expensive. So tr
20110 79 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 73 74 61  y to move consta
20120 6e 74 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  nt functions.   
20130 20 20 20 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74       ** out of t
20140 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65  he inner loop, e
20150 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
20160 73 20 61 6e 20 65 78 74 72 61 20 4f 50 5f 43 6f  s an extra OP_Co
20170 70 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  py. */.        r
20180 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
20190 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
201a0 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b 0a  se, pExpr, -1);.
201b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
201c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d  sert( pExpr->eX=
201d0 3d 45 58 5f 4c 69 73 74 20 7c 7c 20 70 45 78 70  =EX_List || pExp
201e0 72 2d 3e 65 58 3d 3d 45 58 5f 4e 6f 6e 65 20 29  r->eX==EX_None )
201f0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
20200 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20210 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
20220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
20230 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
20240 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
20250 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
20260 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
20270 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
20280 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
20290 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
202a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
202b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
202c0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
202d0 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
202e0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65  Token;.      pDe
202f0 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
20300 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
20310 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
20320 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20330 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
20340 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
20350 20 69 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20   if( pDef==0 && 
20360 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
20370 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
20380 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
20390 63 74 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f  ction(db, "unkno
203a0 77 6e 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  wn", nFarg, enc,
203b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
203c0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
203d0 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
203e0 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20  Finalize!=0 ){. 
203f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
20400 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20410 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
20420 3a 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20  : %s()", zId);. 
20430 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20440 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20450 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
20460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20470 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
20480 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
20490 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
204a0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
204b0 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
204c0 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
204d0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
204e0 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
204f0 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
20500 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
20510 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
20520 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
20530 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
20540 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
20550 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
20560 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
20570 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
20580 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
20590 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
205a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
205b0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
205c0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
205d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
205e0 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
205f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20600 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20610 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
20620 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
20630 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
20640 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
20650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20660 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
20670 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
20680 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
20690 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
206a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
206b0 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
206c0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
206d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
206e0 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45     /* The UNLIKE
206f0 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  LY() function is
20700 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72   a no-op.  The r
20710 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c  esult is the val
20720 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ue.      ** of t
20730 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
20740 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
20750 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
20760 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
20770 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
20780 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20790 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20  nFarg>=1 );.    
207a0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
207b0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
207c0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
207d0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
207e0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69  et);.      }..#i
207f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20800 47 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41  G.      /* The A
20810 46 46 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69  FFINITY() functi
20820 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
20830 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
20840 73 63 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a  scribes.      **
20850 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
20860 74 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ty of the argume
20870 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  nt.  This is use
20880 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66  d for testing of
20890 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51  .      ** the SQ
208a0 4c 69 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e  Lite type logic.
208b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
208c0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
208d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
208e0 43 5f 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20  C_AFFINITY ){.  
208f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
20900 20 2a 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62   *azAff[] = { "b
20910 6c 6f 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e  lob", "text", "n
20920 75 6d 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65  umeric", "intege
20930 72 22 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20  r", "real" };.  
20940 20 20 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a        char aff;.
20950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20960 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
20970 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
20980 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 46  3ExprAffinity(pF
20990 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
209a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
209b0 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
209c0 76 2c 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20  v, target, .    
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 20 20 20 20 20 61 66 66 20 3f 20            aff ? 
209f0 61 7a 41 66 66 5b 61 66 66 2d 53 51 4c 49 54 45  azAff[aff-SQLITE
20a00 5f 41 46 46 5f 42 4c 4f 42 5d 20 3a 20 22 6e 6f  _AFF_BLOB] : "no
20a10 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ne");.        re
20a20 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20  turn target;.   
20a30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20a40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
20a50 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  arg; i++){.     
20a60 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73     if( i<32 && s
20a70 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
20a80 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d  tant(pFarg->a[i]
20a90 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
20aa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
20ab0 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
20ac0 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d    constMask |= M
20ad0 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20  ASKBIT32(i);.   
20ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
20af0 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
20b00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
20b10 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
20b20 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
20b30 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
20b40 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20b50 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
20b60 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
20b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20b80 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
20b90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  {.        if( co
20ba0 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20  nstMask ){.     
20bb0 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65       r1 = pParse
20bc0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
20bd0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
20be0 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20   += nFarg;.     
20bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20c00 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20c10 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
20c20 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20  rse, nFarg);.   
20c30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
20c40 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20  /* For length() 
20c50 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e  and typeof() fun
20c60 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f  ctions with a co
20c70 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20  lumn argument,. 
20c80 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68         ** set th
20c90 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74  e P5 parameter t
20ca0 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  o the OP_Column 
20cb0 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47  opcode to OPFLAG
20cc0 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20  _LENGTHARG.     
20cd0 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f     ** or OPFLAG_
20ce0 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63  TYPEOFARG respec
20cf0 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64  tively, to avoid
20d00 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74   unnecessary dat
20d10 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61  a.        ** loa
20d20 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ding..        */
20d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
20d40 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20d50 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e  (SQLITE_FUNC_LEN
20d60 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  GTH|SQLITE_FUNC_
20d70 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20  TYPEOF))!=0 ){. 
20d80 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72           u8 expr
20d90 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Op;.          as
20da0 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29  sert( nFarg==1 )
20db0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
20dc0 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rt( pFarg->a[0].
20dd0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
20de0 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70        exprOp = p
20df0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
20e00 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
20e10 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43  if( exprOp==TK_C
20e20 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d  OLUMN || exprOp=
20e30 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
20e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
20e50 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
20e60 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47  C_LENGTH==OPFLAG
20e70 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
20e80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20e90 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  ( SQLITE_FUNC_TY
20ea0 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50  PEOF==OPFLAG_TYP
20eb0 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20  EOFARG );.      
20ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20ed0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
20ee0 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  & OPFLAG_LENGTHA
20ef0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
20f00 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
20f10 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20  xpr->op2 = .    
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
20f30 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
20f40 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
20f50 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
20f60 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  RG);.          }
20f70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20f80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20f90 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
20fa0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30  se, pFarg, r1, 0
20fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
20fe0 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
20ff0 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 7d 65 6c  CTOR);.      }el
21000 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
21010 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
21020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21030 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
21040 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
21050 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
21060 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
21070 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
21080 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
21090 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
210a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
210b0 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
210c0 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
210d0 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
210e0 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
210f0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
21100 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
21110 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
21120 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
21130 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
21140 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
21150 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
21160 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
21170 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
21180 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
21190 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
211a0 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
211b0 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
211c0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
211d0 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
211e0 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
211f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
21200 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
21210 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
21220 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
21230 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
21240 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
21250 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
21260 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
21270 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
21280 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
21290 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
212a0 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
212b0 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
212c0 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
212d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
212e0 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 45 78 70   nFarg>=2 && Exp
212f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21300 70 72 2c 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  pr, EP_InfixFunc
21310 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
21320 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
21330 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
21340 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
21350 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
21360 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
21370 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
21380 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
21390 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
213a0 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
213b0 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
213c0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
213d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
213e0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
213f0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
21400 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
21410 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
21420 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
21430 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
21440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21450 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21460 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
21470 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
21480 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
21490 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
214a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
214b0 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20 20 20 20  T_SQL_FUNC.     
214c0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
214d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
214e0 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a 20 20 20  NC_OFFSET ){.   
214f0 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20       Expr *pArg 
21500 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
21510 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
21520 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   pArg->op==TK_CO
21530 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
21540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21550 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
21560 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c 65 2c 20  , pArg->iTable, 
21570 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74  pArg->iColumn, t
21580 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
21590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
215a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
215b0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
215c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
215d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
215e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
215f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21600 64 62 65 41 64 64 4f 70 34 28 76 2c 20 70 50 61  dbeAddOp4(v, pPa
21610 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3f 20  rse->iSelfTab ? 
21620 4f 50 5f 50 75 72 65 46 75 6e 63 30 20 3a 20 4f  OP_PureFunc0 : O
21630 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 0a 20 20 20  P_Function0,.   
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
21660 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 20 28 63  , r1, target, (c
21670 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
21680 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20  NCDEF);.        
21690 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
216a0 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
216b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
216c0 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
216d0 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
216e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
216f0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
21700 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
21710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21720 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20  return target;. 
21730 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
21740 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
21750 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
21760 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
21770 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
21780 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20    int nCol;.    
21790 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
217a0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
217b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
217c0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
217d0 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53      if( op==TK_S
217e0 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d  ELECT && (nCol =
217f0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
21800 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
21810 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
21820 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
21830 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43  Error(pParse, nC
21840 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ol, 1);.      }e
21850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
21860 75 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53  urn sqlite3CodeS
21870 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
21880 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
21890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
218a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
218b0 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  se TK_SELECT_COL
218c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
218d0 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   n;.      if( pE
218e0 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62  xpr->pLeft->iTab
218f0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
21900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21910 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 43  Table = sqlite3C
21920 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
21930 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
21940 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
21950 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
21960 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
21970 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
21980 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
21990 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
219a0 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
219b0 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62    && pExpr->iTab
219c0 6c 65 21 3d 28 6e 20 3d 20 73 71 6c 69 74 65 33  le!=(n = sqlite3
219d0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
219e0 45 78 70 72 2d 3e 70 4c 65 66 74 29 29 20 0a 20  Expr->pLeft)) . 
219f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21a10 70 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75  pParse, "%d colu
21a20 6d 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20  mns assigned %d 
21a30 76 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20  values",.       
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
21a60 69 54 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20  iTable, n);.    
21a70 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
21a80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
21a90 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e 69  Table + pExpr->i
21aa0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
21ab0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
21ac0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
21ad0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
21ae0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21af0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
21b00 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
21b10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21b30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21b40 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
21b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21b60 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
21b70 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
21b80 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
21b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21bb0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
21bc0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
21bd0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
21be0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
21bf0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
21c00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21c10 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
21c20 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
21c30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21c40 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
21c50 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
21c60 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23   target;.    }.#
21c70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21c80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
21c90 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
21ca0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
21cb0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
21cc0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
21cd0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
21ce0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
21cf0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
21d00 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
21d10 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
21d20 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
21d30 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21d40 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
21d50 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
21d60 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
21d70 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
21d80 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
21d90 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
21da0 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  {.      exprCode
21db0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
21dc0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
21dd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
21de0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
21df0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41  .    case TK_SPA
21e00 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
21e10 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
21e20 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
21e30 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70      pExpr = pExp
21e40 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
21e50 67 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64  goto expr_code_d
21e60 6f 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30  oover; /* 2018-0
21e70 34 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65  4-28: Prevent de
21e80 65 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53  ep recursion. OS
21e90 53 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a  SFuzz. */.    }.
21ea0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49  .    case TK_TRI
21eb0 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  GGER: {.      /*
21ec0 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69   If the opcode i
21ed0 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68  s TK_TRIGGER, th
21ee0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
21ef0 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  n is a reference
21f00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63  .      ** to a c
21f10 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
21f20 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75  .* or old.* pseu
21f30 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61  do-tables availa
21f40 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ble to.      ** 
21f50 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
21f60 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45  . In this case E
21f70 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65  xpr.iTable is se
21f80 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20  t to 1 for the. 
21f90 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73       ** new.* ps
21fa0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30  eudo-table, or 0
21fb0 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70   for the old.* p
21fc0 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70  seudo-table. Exp
21fd0 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  r.iColumn.      
21fe0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
21ff0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70   column of the p
22000 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72  seudo-table to r
22010 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f  ead, or to -1 to
22020 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74  .      ** read t
22030 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a  he rowid field..
22040 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22050 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
22060 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
22070 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61  using an OP_Para
22080 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31  m opcode. The p1
22090 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65  .      ** parame
220a0 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
220b0 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64  for an old.rowid
220c0 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74   reference, or t
220d0 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a  o (i+1).      **
220e0 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
220f0 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20  other column of 
22100 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
22110 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20  -table, where . 
22120 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65       ** i is the
22130 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
22140 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e  lumn. For a new.
22150 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
22160 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   p1 is.      ** 
22170 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68  set to (n+1), wh
22180 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d  ere n is the num
22190 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
221a0 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61  n each pseudo-ta
221b0 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f  ble..      ** Fo
221c0 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  r a reference to
221d0 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d   any other colum
221e0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70  n in the new.* p
221f0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a  seudo-table, p1.
22200 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
22210 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72  to (n+2+i), wher
22220 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73  e n and i are as
22230 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75   defined previou
22240 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a  sly. For.      *
22250 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
22260 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68  e table on which
22270 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65   triggers are be
22280 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20  ing fired is.   
22290 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61     ** declared a
222a0 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
222b0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
222c0 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
222d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
222e0 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72  Then p1 is inter
222f0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
22300 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
22310 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d    **   p1==0   -
22320 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20  >    old.rowid  
22330 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20     p1==3   ->   
22340 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20   new.rowid.     
22350 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e   **   p1==1   ->
22360 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20      old.a       
22370 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20    p1==4   ->    
22380 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20  new.a.      **  
22390 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f   p1==2   ->    o
223a0 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d  ld.b         p1=
223b0 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62  =5   ->    new.b
223c0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f         .      */
223d0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
223e0 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
223f0 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f  ( pExpr->eX==EX_
22400 54 61 62 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Tab );.      pTa
22410 62 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 54 61  b = pExpr->x.pTa
22420 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
22430 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
22440 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
22450 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
22460 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
22470 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
22480 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
22490 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
224a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
224b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
224c0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
224d0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
224e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
224f0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
22500 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
22510 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
22520 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
22530 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
22540 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
22550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22560 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
22570 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
22580 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
22590 72 2d 3e 65 58 3d 3d 45 58 5f 54 61 62 20 29 3b  r->eX==EX_Tab );
225a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
225b0 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73  nt((v, "r[%d]=%s
225c0 2e 25 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20  .%s", target,.  
225d0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54        (pExpr->iT
225e0 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22  able ? "new" : "
225f0 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28  old"),.        (
22600 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
22610 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78   ? "rowid" : pEx
22620 70 72 2d 3e 78 2e 70 54 61 62 2d 3e 61 43 6f 6c  pr->x.pTab->aCol
22630 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
22640 2e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 29 29  .zName).      ))
22650 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
22660 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
22670 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
22680 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
22690 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
226a0 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
226b0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
226c0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
226d0 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
226e0 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
226f0 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
22700 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a   real..      **.
22710 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
22720 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37  E-OF: R-60985-57
22730 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  662 SQLite will 
22740 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
22750 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20  e back to.      
22760 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
22770 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  t when extractin
22780 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65  g it from the re
22790 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cord.  */.      
227a0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
227b0 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
227c0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
227d0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
227e0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
227f0 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
22800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22810 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
22820 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
22830 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
22840 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
22850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
22860 65 20 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20  e TK_VECTOR: {. 
22870 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22880 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
22890 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
228a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
228b0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
228c0 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20  TK_IF_NULL_ROW: 
228d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
228e0 49 4e 52 3b 0a 20 20 20 20 20 20 61 64 64 72 49  INR;.      addrI
228f0 4e 52 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  NR = sqlite3Vdbe
22900 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
22910 75 6c 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69  ullRow, pExpr->i
22920 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 6e  Table);.      in
22930 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
22940 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
22950 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
22960 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22970 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
22980 48 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29  Here(v, addrINR)
22990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
229a0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
229b0 64 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a  ddrINR, inReg);.
229c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
229d0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
229e0 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
229f0 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
22a00 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
22a10 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
22a20 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
22a30 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
22a40 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
22a50 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
22a60 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
22a70 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
22a80 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
22a90 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
22aa0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
22ab0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
22ac0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
22ad0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
22ae0 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
22af0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
22b00 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
22b10 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
22b20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
22b30 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
22b40 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
22b50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
22b60 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
22b70 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
22b80 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
22b90 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
22ba0 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
22bb0 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
22bc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
22bd0 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
22be0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
22bf0 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
22c00 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
22c10 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
22c20 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
22c30 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
22c40 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
22c50 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
22c60 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
22c70 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
22c80 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
22c90 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
22ca0 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
22cb0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
22cc0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
22cd0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
22ce0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
22cf0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
22d00 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
22d10 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
22d20 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
22d30 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
22d40 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
22d50 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
22d60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
22d70 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
22d80 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
22d90 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22db0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
22dc0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
22dd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
22de0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
22df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
22e00 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
22e10 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
22e20 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
22e30 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
22e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
22e50 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
22e60 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
22e70 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22ea0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
22eb0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
22ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
22ed0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
22ee0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
22ef0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22f00 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
22f10 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
22f20 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
22f30 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f50 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
22f60 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
22f70 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
22fa0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
22fb0 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
22fe0 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
22ff0 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20  rm B) */..      
23000 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65  assert( pExpr->e
23010 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b 0a 20 20  X==EX_List );.  
23020 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
23030 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
23040 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
23050 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
23060 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
23070 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
23080 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
23090 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
230a0 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
230b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
230c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
230d0 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
230e0 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
230f0 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
23100 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
23110 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
23120 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
23130 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
23140 72 28 26 74 65 6d 70 58 2c 20 65 78 70 72 43 6f  r(&tempX, exprCo
23150 64 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c  deVector(pParse,
23160 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
23170 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
23180 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
23190 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ==0 );.        m
231a0 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61 72 65  emset(&opCompare
231b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70 43 6f  , 0, sizeof(opCo
231c0 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20 20 20  mpare));.       
231d0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
231e0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
231f0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
23200 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20   &tempX;.       
23210 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
23220 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
23230 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
23240 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
23250 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
23260 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
23270 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
23280 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
23290 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
232a0 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
232b0 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
232c0 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
232d0 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
232e0 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
232f0 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
23300 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
23310 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
23320 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
23330 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
23340 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
23350 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
23360 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
23370 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
23380 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
23390 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
233a0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 78 2e 70 52    opCompare.x.pR
233b0 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
233c0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
233d0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 65       opCompare.e
233e0 58 20 3d 20 45 58 5f 52 69 67 68 74 3b 0a 20 20  X = EX_Right;.  
233f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23400 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
23410 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
23420 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
23430 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
23440 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23450 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
23460 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
23470 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
23480 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23490 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
234a0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
234b0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
234c0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
234d0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
234e0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
234f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
23500 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23510 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
23520 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
23530 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
23540 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23550 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
23560 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
23570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23580 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
23590 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
235a0 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
235b0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
235c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
235d0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
235e0 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
235f0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
23600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23620 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
23630 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
23640 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23650 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
23660 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
23670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23680 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23690 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
236a0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
236b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
236c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
236d0 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
236e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
236f0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
23700 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
23710 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
23720 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
23730 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
23740 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
23750 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
23760 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
23770 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
23780 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23790 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
237a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
237b0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
237c0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
237d0 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
237e0 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
237f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
23800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23810 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
23820 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
23830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
23840 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
23850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23860 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23870 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23880 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
23890 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
238a0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
238b0 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
238c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
238d0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
238e0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
238f0 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
23900 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
23910 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
23920 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
23930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23940 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
23950 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
23960 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
23970 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
239a0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
239b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
239c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
239d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
239e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
239f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23a00 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
23a10 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
23a20 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
23a30 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
23a40 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
23a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
23a60 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
23a70 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
23a80 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
23a90 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
23aa0 2a 0a 2a 2a 20 49 66 20 72 65 67 44 65 73 74 3e  *.** If regDest>
23ab0 3d 30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  =0 then the resu
23ac0 6c 74 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f  lt is always sto
23ad0 72 65 64 20 69 6e 20 74 68 61 74 20 72 65 67 69  red in that regi
23ae0 73 74 65 72 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ster and the.** 
23af0 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20 72 65  result is not re
23b00 75 73 61 62 6c 65 2e 20 20 49 66 20 72 65 67 44  usable.  If regD
23b10 65 73 74 3c 30 20 74 68 65 6e 20 74 68 69 73 20  est<0 then this 
23b20 72 6f 75 74 69 6e 65 20 69 73 20 66 72 65 65 20  routine is free 
23b30 74 6f 20 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  to .** store the
23b40 20 76 61 6c 75 65 20 77 68 65 72 65 65 76 65 72   value whereever
23b50 20 69 74 20 77 61 6e 74 73 2e 20 20 54 68 65 20   it wants.  The 
23b60 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 74  register where t
23b70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a  he expression .*
23b80 2a 20 69 73 20 73 74 6f 72 65 64 20 69 73 20 72  * is stored is r
23b90 65 74 75 72 6e 65 64 2e 20 20 57 68 65 6e 20 72  eturned.  When r
23ba0 65 67 44 65 73 74 3c 30 2c 20 74 77 6f 20 69 64  egDest<0, two id
23bb0 65 6e 74 69 63 61 6c 20 65 78 70 72 65 73 73 69  entical expressi
23bc0 6f 6e 73 20 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65  ons will.** code
23bd0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 72 65 67   to the same reg
23be0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
23bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
23c00 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
23c10 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
23c20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23c30 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
23c40 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
23c50 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
23c60 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
23c70 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
23c80 72 65 67 44 65 73 74 20 20 20 20 20 20 20 2f 2a  regDest       /*
23c90 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
23ca0 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
23cb0 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  r */.){.  ExprLi
23cc0 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
23cd0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
23ce0 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
23cf0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
23d00 70 72 3b 0a 20 20 69 66 28 20 72 65 67 44 65 73  pr;.  if( regDes
23d10 74 3c 30 20 26 26 20 70 20 29 7b 0a 20 20 20 20  t<0 && p ){.    
23d20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23d30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
23d40 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
23d50 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
23d60 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
23d70 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
23d80 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
23d90 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
23da0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 70 49  ExprCompare(0,pI
23db0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
23dc0 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
23dd0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
23de0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
23df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23e00 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 73 71    }.  pExpr = sq
23e10 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
23e20 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
23e30 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
23e40 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
23e50 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
23e60 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
23e70 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23e80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
23e90 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
23ea0 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
23eb0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 67 44 65  reusable = regDe
23ec0 73 74 3c 30 3b 0a 20 20 20 20 20 69 66 28 20 72  st<0;.     if( r
23ed0 65 67 44 65 73 74 3c 30 20 29 20 72 65 67 44 65  egDest<0 ) regDe
23ee0 73 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  st = ++pParse->n
23ef0 4d 65 6d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  Mem;.     pItem-
23f00 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
23f10 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 7d 0a   = regDest;.  }.
23f20 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
23f30 45 78 70 72 20 3d 20 70 3b 0a 20 20 72 65 74 75  Expr = p;.  retu
23f40 72 6e 20 72 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f  rn regDest;.}../
23f50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
23f60 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
23f70 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
23f80 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
23f90 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
23fa0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
23fb0 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
23fc0 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
23fd0 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
23fe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23ff0 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
24000 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24010 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
24020 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
24030 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
24040 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
24050 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
24060 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
24070 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
24080 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
24090 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
240a0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
240b0 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
240c0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
240d0 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
240e0 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
240f0 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
24100 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
24110 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
24120 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
24130 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
24140 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
24150 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
24160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
24170 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
24180 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
24190 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
241a0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
241b0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
241c0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
241d0 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
241e0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
241f0 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
24200 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
24210 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
24220 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
24230 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
24240 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
24250 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
24260 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
24270 72 73 65 2c 20 70 45 78 70 72 2c 20 2d 31 29 3b  rse, pExpr, -1);
24280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
24290 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
242a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
242b0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
242c0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
242d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
242e0 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
242f0 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
24300 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
24310 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24320 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
24330 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
24340 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
24350 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24360 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
24370 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24380 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
24390 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
243a0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
243b0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
243c0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
243d0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
243e0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
243f0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
24400 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
24410 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
24420 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
24430 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
24440 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
24450 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
24460 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
24470 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
24480 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
24490 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
244a0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
244b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
244c0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
244d0 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
244e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
244f0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
24500 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
24510 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
24520 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
24530 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
24540 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
24550 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  be!=0 || pParse-
24560 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
24570 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52  d );.    if( inR
24580 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50  eg!=target && pP
24590 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
245a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
245b0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
245c0 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
245d0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
245e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
245f0 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69  ** Make a transi
24600 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72  ent copy of expr
24610 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
24620 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73   then code it us
24630 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  ing.** sqlite3Ex
24640 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20  prCode().  This 
24650 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75  routine works ju
24660 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45  st like sqlite3E
24670 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63  xprCode().** exc
24680 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70  ept that the inp
24690 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ut expression is
246a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
246b0 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
246c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
246d0 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
246e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
246f0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24700 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
24710 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24720 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
24730 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
24740 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  , 0);.  if( !db-
24750 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24760 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
24770 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
24780 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  arget);.  sqlite
24790 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
247a0 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
247b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
247c0 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
247d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
247e0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
247f0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
24800 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
24810 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
24820 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
24830 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
24840 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66  ster target.  If
24850 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
24860 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  is constant, the
24870 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
24880 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74  * might choose t
24890 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65  o code the expre
248a0 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c  ssion at initial
248b0 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
248c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
248d0 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28  rCodeFactorable(
248e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
248f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
24900 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70  target){.  if( p
24910 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
24920 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45  ctor && sqlite3E
24930 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
24940 4a 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  Join(pExpr) ){. 
24950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24960 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
24970 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
24980 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
24990 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
249a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
249b0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
249c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
249d0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
249e0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
249f0 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
24a00 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
24a10 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
24a20 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
24a30 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
24a40 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
24a50 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
24a60 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
24a70 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
24a80 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
24a90 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
24aa0 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
24ab0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
24ac0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
24ad0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
24ae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24af0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
24b00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
24b10 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
24b20 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
24b30 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
24b40 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
24b50 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
24b60 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
24b70 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
24b80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24b90 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
24ba0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
24bb0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
24bc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
24bd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
24be0 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
24bf0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
24c00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
24c10 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
24c20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
24c30 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
24c40 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
24c50 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
24c60 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
24c70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24c80 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
24c90 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
24ca0 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
24cb0 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
24cc0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
24cd0 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
24ce0 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
24cf0 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
24d00 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
24d10 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
24d20 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
24d30 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
24d40 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
24d50 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
24d60 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
24d70 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  ed.  The number 
24d80 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 0a 2a 2a  returned will.**
24d90 20 75 73 75 61 6c 6c 79 20 62 65 20 70 4c 69 73   usually be pLis
24da0 74 2d 3e 6e 45 78 70 72 20 62 75 74 20 6d 69 67  t->nExpr but mig
24db0 68 74 20 62 65 20 72 65 64 75 63 65 64 20 69 66  ht be reduced if
24dc0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
24dd0 54 52 45 46 0a 2a 2a 20 69 73 20 64 65 66 69 6e  TREF.** is defin
24de0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
24df0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
24e00 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
24e10 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
24e20 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
24e30 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
24e40 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
24e50 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
24e60 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
24e70 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
24e80 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
24e90 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
24ea0 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
24eb0 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
24ec0 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
24ed0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
24ee0 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
24ef0 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
24f00 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
24f10 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
24f20 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
24f30 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
24f40 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
24f50 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
24f60 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
24f70 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
24f80 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
24f90 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
24fa0 72 65 2e 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  re..** If SQLITE
24fb0 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 20 69 73  _ECEL_OMITREF is
24fc0 20 61 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20   also set, then 
24fd0 74 68 65 20 76 61 6c 75 65 73 20 77 69 74 68 20  the values with 
24fe0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
24ff0 30 0a 2a 2a 20 61 72 65 20 73 69 6d 70 6c 79 20  0.** are simply 
25000 6f 6d 69 74 74 65 64 20 72 61 74 68 65 72 20 74  omitted rather t
25010 68 61 6e 20 62 65 69 6e 67 20 63 6f 70 69 65 64  han being copied
25020 20 66 72 6f 6d 20 73 72 63 52 65 67 2e 0a 2a 2f   from srcReg..*/
25030 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
25040 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
25050 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
25060 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
25070 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
25080 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
25090 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
250a0 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
250b0 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74   */.  int target
250c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72  ,        /* Wher
250d0 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c  e to write resul
250e0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52  ts */.  int srcR
250f0 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  eg,        /* So
25100 75 72 63 65 20 72 65 67 69 73 74 65 72 73 20 69  urce registers i
25110 66 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  f SQLITE_ECEL_RE
25120 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  F */.  u8 flags 
25130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
25140 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
25150 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
25160 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
25170 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Item;.  int i, j
25180 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
25190 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
251a0 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
251b0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
251c0 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  y;.  Vdbe *v = p
251d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
251e0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
251f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
25200 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
25210 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
25220 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
25230 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
25240 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
25250 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
25260 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
25270 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
25280 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
25290 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
252a0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
252b0 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
252c0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
252d0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
252e0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 23 69 66  Item->pExpr;.#if
252f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25300 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
25310 43 45 53 0a 20 20 20 20 69 66 28 20 70 49 74 65  CES.    if( pIte
25320 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 29 7b  m->bSorterRef ){
25330 0a 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20  .      i--;.    
25340 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
25350 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
25360 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25370 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20  ECEL_REF)!=0 && 
25380 28 6a 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  (j = pItem->u.x.
25390 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
253a0 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  {.      if( flag
253b0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
253c0 4f 4d 49 54 52 45 46 20 29 7b 0a 20 20 20 20 20  OMITREF ){.     
253d0 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20     i--;.        
253e0 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n--;.      }else
253f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25400 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
25410 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
25420 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
25430 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
25440 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
25450 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
25460 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  !=0.           &
25470 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
25480 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
25490 45 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20  Expr).    ){.   
254a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
254b0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
254c0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
254d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
254e0 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
254f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25500 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
25510 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
25520 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
25530 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
25540 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
25550 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
25560 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
25570 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
25580 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
25590 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
255a0 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
255b0 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
255c0 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
255d0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
255e0 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
255f0 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
25600 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
25610 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
25620 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
25630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25640 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
25650 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
25660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25670 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25680 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
25690 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
256a0 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
256b0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
256c0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
256d0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
256e0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
256f0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
25700 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
25710 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
25720 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
25730 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
25740 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
25750 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
25760 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a 75 6d 70 49  **.** The xJumpI
25770 66 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  f parameter dete
25780 72 6d 69 6e 65 73 20 64 65 74 61 69 6c 73 3a 0a  rmines details:.
25790 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c 4c 3a 20 20  **.**    NULL:  
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 53 74 6f 72 65 20 74 68 65 20 62 6f 6f 6c 65   Store the boole
257c0 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  an result in reg
257d0 5b 64 65 73 74 5d 0a 2a 2a 20 20 20 20 73 71 6c  [dest].**    sql
257e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 3a 20  ite3ExprIfTrue: 
257f0 20 20 20 20 20 4a 75 6d 70 20 74 6f 20 64 65 73       Jump to des
25800 74 20 69 66 20 74 72 75 65 0a 2a 2a 20 20 20 20  t if true.**    
25810 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
25820 73 65 3a 20 20 20 20 20 4a 75 6d 70 20 74 6f 20  se:     Jump to 
25830 64 65 73 74 20 69 66 20 66 61 6c 73 65 0a 2a 2a  dest if false.**
25840 0a 2a 2a 20 54 68 65 20 6a 75 6d 70 49 66 4e 75  .** The jumpIfNu
25850 6c 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ll parameter is 
25860 69 67 6e 6f 72 65 64 20 69 66 20 78 4a 75 6d 70  ignored if xJump
25870 49 66 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  If is NULL..*/.s
25880 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
25890 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
258a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
258b0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
258c0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
258d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
258e0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
258f0 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
25900 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
25910 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
25920 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
25930 6f 6e 20 6f 72 20 73 74 6f 72 61 67 65 20 6c 6f  on or storage lo
25940 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
25950 20 28 2a 78 4a 75 6d 70 29 28 50 61 72 73 65 2a   (*xJump)(Parse*
25960 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
25970 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
25980 6b 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ke */.  int jump
25990 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
259a0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
259b0 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
259c0 4c 20 2a 2f 0a 29 7b 0a 20 45 78 70 72 20 65 78  L */.){. Expr ex
259d0 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
259e0 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
259f0 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
25a00 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
25a10 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
25a20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
25a30 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
25a40 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
25a50 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
25a60 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
25a70 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
25a80 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
25a90 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
25aa0 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
25ab0 67 69 73 74 65 72 20 2a 2f 0a 0a 0a 20 20 6d 65  gister */...  me
25ac0 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
25ad0 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
25ae0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
25af0 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
25b00 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
25b10 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
25b20 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
25b30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
25b40 65 58 3d 3d 45 58 5f 4c 69 73 74 20 29 3b 0a 20  eX==EX_List );. 
25b50 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
25b60 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
25b70 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
25b80 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
25b90 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
25ba0 70 72 41 6e 64 2e 78 2e 70 52 69 67 68 74 20 3d  prAnd.x.pRight =
25bb0 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 65   &compRight;.  e
25bc0 78 70 72 41 6e 64 2e 65 58 20 3d 20 45 58 5f 52  xprAnd.eX = EX_R
25bd0 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
25be0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
25bf0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
25c00 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
25c10 66 74 2e 78 2e 70 52 69 67 68 74 20 3d 20 70 45  ft.x.pRight = pE
25c20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
25c30 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70  0].pExpr;.  comp
25c40 4c 65 66 74 2e 65 58 20 3d 20 45 58 5f 52 69 67  Left.eX = EX_Rig
25c50 68 74 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  ht;.  compRight.
25c60 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
25c70 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
25c80 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
25c90 67 68 74 2e 78 2e 70 52 69 67 68 74 20 3d 20 70  ght.x.pRight = p
25ca0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
25cb0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [1].pExpr;.  com
25cc0 70 52 69 67 68 74 2e 65 58 20 3d 20 45 58 5f 52  pRight.eX = EX_R
25cd0 69 67 68 74 3b 0a 20 20 65 78 70 72 54 6f 52 65  ight;.  exprToRe
25ce0 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 65  gister(&exprX, e
25cf0 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50  xprCodeVector(pP
25d00 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
25d10 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
25d20 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 78 4a   xJump ){.    xJ
25d30 75 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  ump(pParse, &exp
25d40 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
25d50 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
25d60 7b 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68  {.    /* Mark th
25d70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
25d80 62 65 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  being from the O
25d90 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
25da0 65 20 6f 66 20 61 20 6a 6f 69 6e 0a 20 20 20 20  e of a join.    
25db0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ** so that the s
25dc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
25dd0 72 67 65 74 28 29 20 72 6f 75 74 69 6e 65 20 77  rget() routine w
25de0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
25df0 74 6f 20 6d 6f 76 65 0a 20 20 20 20 2a 2a 20 69  to move.    ** i
25e00 74 20 69 6e 74 6f 20 74 68 65 20 50 61 72 73 65  t into the Parse
25e10 2e 70 43 6f 6e 73 74 45 78 70 72 20 6c 69 73 74  .pConstExpr list
25e20 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 75 73 65  .  We should use
25e30 20 61 20 6e 65 77 20 62 69 74 20 66 6f 72 20 74   a new bit for t
25e40 68 69 73 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  his,.    ** for 
25e50 63 6c 61 72 69 74 79 2c 20 62 75 74 20 77 65 20  clarity, but we 
25e60 61 72 65 20 6f 75 74 20 6f 66 20 62 69 74 73 20  are out of bits 
25e70 69 6e 20 74 68 65 20 45 78 70 72 2e 66 6c 61 67  in the Expr.flag
25e80 73 20 66 69 65 6c 64 20 73 6f 20 77 65 0a 20 20  s field so we.  
25e90 20 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75    ** have to reu
25ea0 73 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  se the EP_FromJo
25eb0 69 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e  in bit.  Bummer.
25ec0 20 2a 2f 0a 20 20 20 20 65 78 70 72 58 2e 66 6c   */.    exprX.fl
25ed0 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f  ags |= EP_FromJo
25ee0 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  in;.    sqlite3E
25ef0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
25f00 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
25f10 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dest);.  }.  sql
25f20 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
25f30 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
25f40 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
25f50 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
25f60 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
25f70 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
25f80 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
25f90 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  e  && jumpIfNull
25fa0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
25fb0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
25fc0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
25fd0 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20 6a  ExprIfTrue  && j
25fe0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
25ff0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
26000 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
26010 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  ==sqlite3ExprIfT
26020 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e 75  rue  && jumpIfNu
26030 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
26040 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
26050 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74  se( xJump==sqlit
26060 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26  e3ExprIfTrue  &&
26070 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
26080 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
26090 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75  .  testcase( xJu
260a0 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49  mp==sqlite3ExprI
260b0 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70 49 66  fFalse && jumpIf
260c0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
260d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
260e0 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c  case( xJump==sql
260f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 20  ite3ExprIfFalse 
26100 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
26110 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
26120 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78  );.  testcase( x
26130 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70  Jump==sqlite3Exp
26140 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d 70  rIfFalse && jump
26150 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
26160 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
26170 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73  stcase( xJump==s
26180 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26190 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  e && jumpIfNull!
261a0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
261b0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
261c0 20 78 4a 75 6d 70 3d 3d 30 20 29 3b 0a 7d 0a 0a   xJump==0 );.}..
261d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
261e0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
261f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
26200 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
26210 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
26220 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
26230 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26240 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
26250 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
26260 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
26270 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
26280 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
26290 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
262a0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
262b0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
262c0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
262d0 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
262e0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
262f0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
26300 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26310 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
26320 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
26330 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
26340 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
26350 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
26360 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
26370 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
26380 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
26390 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
263a0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
263b0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
263c0 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
263d0 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
263e0 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
263f0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
26400 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
26410 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
26420 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
26430 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
26440 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
26450 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
26460 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
26470 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
26480 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
26490 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
264a0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
264b0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
264c0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
264d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
264e0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
264f0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
26500 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
26510 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
26520 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
26530 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
26540 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
26550 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
26560 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
26570 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
26580 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
26590 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
265a0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
265b0 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
265c0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
265d0 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
265e0 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
265f0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
26600 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
26610 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
26620 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
26630 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
26640 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
26650 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
26660 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
26670 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
26680 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
26690 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
266a0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
266b0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
266c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65  assert( pExpr->e
266d0 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20  X==EX_Right );. 
266e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
266f0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
26700 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20  Expr->x.pRight, 
26710 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
26720 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26730 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
26740 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
26750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26760 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
26770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
26780 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
26790 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
267a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
267b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
267c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
267d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
267e0 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68  xpr->eX==EX_Righ
267f0 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
26800 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
26810 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52  rse, pExpr->x.pR
26820 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
26830 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
26840 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26850 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
26860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
26870 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
26880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26890 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
268a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
268b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
268c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
268d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
268e0 5f 54 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20  _TRUTH: {.      
268f0 69 6e 74 20 69 73 4e 6f 74 3b 20 20 20 20 20 20  int isNot;      
26900 2f 2a 20 49 53 20 4e 4f 54 20 54 52 55 45 20 6f  /* IS NOT TRUE o
26910 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a  r IS NOT FALSE *
26920 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  /.      int isTr
26930 75 65 3b 20 20 20 20 20 2f 2a 20 49 53 20 54 52  ue;     /* IS TR
26940 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55  UE or IS NOT TRU
26950 45 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  E */.      testc
26960 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
26970 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 73 4e 6f  =0 );.      isNo
26980 74 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3d 3d  t = pExpr->op2==
26990 54 4b 5f 49 53 4e 4f 54 3b 0a 20 20 20 20 20 20  TK_ISNOT;.      
269a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65  assert( pExpr->e
269b0 58 3d 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20  X==EX_Right );. 
269c0 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
269d0 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
269e0 6c 75 65 28 70 45 78 70 72 2d 3e 78 2e 70 52 69  lue(pExpr->x.pRi
269f0 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
26a00 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
26a10 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
26a20 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
26a30 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
26a40 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
26a50 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
26a60 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26a70 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
26a80 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f           isNot ?
26ab0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26ac0 4c 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d  LL : 0);.      }
26ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
26ae0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26af0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
26b00 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20          isNot ? 
26b30 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
26b40 4c 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  L : 0);.      }.
26b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26b60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
26b70 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
26b80 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74  SNOT:.      test
26b90 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
26ba0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
26bb0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
26bc0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
26bd0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
26be0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
26bf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51   jumpIfNull = SQ
26c00 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
26c10 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
26c20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
26c30 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
26c40 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
26c50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
26c60 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
26c70 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
26c80 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
26c90 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
26ca0 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  or(pExpr->pLeft)
26cb0 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f   ) goto default_
26cc0 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74  expr;.      test
26cd0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
26ce0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
26cf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
26d00 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
26d10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
26d20 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 61 73  Free1);.      as
26d30 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d  sert( pExpr->eX=
26d40 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20  =EX_Right );.   
26d50 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
26d60 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
26d70 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69  se, pExpr->x.pRi
26d80 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
26d90 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
26da0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
26db0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
26dc0 78 2e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  x.pRight, op,.  
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
26df0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
26e00 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
26e10 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
26e20 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
26e30 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
26e40 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
26e50 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
26e60 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
26e70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
26e80 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
26e90 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
26ea0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
26eb0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
26ec0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
26ed0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
26ee0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
26ef0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
26f00 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
26f10 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
26f20 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
26f30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26f40 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
26f50 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
26f60 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  q);.      VdbeCo
26f70 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
26f80 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
26f90 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
26fa0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
26fb0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
26fc0 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66  =OP_Eq && jumpIf
26fd0 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
26fe0 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LEQ);.      asse
26ff0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
27000 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
27010 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Ne);.      Vdb
27020 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27030 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
27040 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
27050 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
27060 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
27070 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d  op==OP_Ne && jum
27080 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f  pIfNull!=SQLITE_
27090 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74  NULLEQ);.      t
270a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
270b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
270c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
270d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
270e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
270f0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
27100 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
27110 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
27120 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
27130 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
27140 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
27150 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
27160 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
27170 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
27180 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
27190 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
271a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
271b0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
271c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
271d0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
271e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
271f0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
27200 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62  dest);.      Vdb
27210 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
27220 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
27230 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
27240 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
27250 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
27260 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
27270 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
27280 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27290 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
272a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
272b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
272c0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
272d0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
272e0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c  pExpr, dest, sql
272f0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 2c 20  ite3ExprIfTrue, 
27300 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
27310 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
27320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27330 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
27340 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
27350 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
27360 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
27370 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
27380 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
27390 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
273a0 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
273b0 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
273c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
273d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
273e0 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
273f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
27400 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
27410 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
27420 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
27430 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
27440 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
27450 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
27460 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
27470 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70  .    default_exp
27480 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  r:.      if( exp
27490 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
274a0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
274b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
274c0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
274d0 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
274e0 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
274f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d  {.        /* No-
27500 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
27510 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
27520 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
27530 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
27540 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
27550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27560 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
27570 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
27580 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
27590 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
275a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
275b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
275c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
275d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
275e0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
275f0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
27600 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
27610 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
27620 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
27630 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
27640 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
27650 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20  se, regFree2);  
27660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
27670 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
27680 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
27690 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
276a0 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
276b0 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
276c0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
276d0 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
276e0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
276f0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
27700 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
27710 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
27720 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
27730 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
27740 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
27750 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
27760 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
27770 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
27780 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
27790 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  LL or fall throu
277a0 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
277b0 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69  .** is 0..*/.voi
277c0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
277d0 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
277e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
277f0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
27800 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
27810 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
27820 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
27830 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
27840 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
27850 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
27860 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
27870 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
27880 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
27890 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
278a0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
278b0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
278c0 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  rn; /* Existence
278d0 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
278e0 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
278f0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20  if( pExpr==0 )  
27900 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
27910 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
27920 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
27930 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
27940 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
27950 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
27960 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
27970 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
27980 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
27990 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
279a0 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
279b0 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
279c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
279d0 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
279e0 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
279f0 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
27a00 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
27a10 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
27a20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
27a30 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
27a50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
27a60 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
27a70 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
27a80 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
27a90 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
27aa0 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
27ab0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
27ac0 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
27ad0 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
27ae0 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
27af0 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
27b00 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
27b10 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
27b20 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
27b30 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
27b40 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
27b50 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
27b60 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
27b70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
27b80 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
27b90 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
27ba0 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
27bb0 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
27bc0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
27bd0 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
27be0 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
27bf0 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
27c00 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
27c10 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
27c20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
27c30 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
27c40 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
27c50 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
27c60 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
27c70 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27c80 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
27c90 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
27ca0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
27cb0 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
27cc0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
27cd0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
27ce0 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
27cf0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
27d00 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
27d10 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
27d20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
27d30 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
27d40 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
27d50 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
27d60 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
27d70 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
27d80 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
27d90 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
27da0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
27db0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
27dc0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
27dd0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
27de0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
27df0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27e00 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27e10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
27e20 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
27e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
27e40 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67 68 74  pr->eX==EX_Right
27e50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27e60 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27e70 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52  rse, pExpr->x.pR
27e80 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
27e90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
27ea0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
27eb0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
27ec0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
27ed0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
27ee0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
27ef0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
27f00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
27f10 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
27f20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27f30 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
27f40 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
27f50 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 61 73  FNULL);.      as
27f60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 65 58 3d  sert( pExpr->eX=
27f70 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 20  =EX_Right );.   
27f80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27f90 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
27fa0 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 64  xpr->x.pRight, d
27fb0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27fd0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
27fe0 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
27ff0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
28000 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
28010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
28020 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
28030 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28040 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
28050 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
28060 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
28070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28080 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54   }.    case TK_T
28090 52 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e  RUTH: {.      in
280a0 74 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53  t isNot;   /* IS
280b0 20 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20   NOT TRUE or IS 
280c0 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20  NOT FALSE */.   
280d0 20 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20     int isTrue;  
280e0 2f 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53  /* IS TRUE or IS
280f0 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20   NOT TRUE */.   
28100 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
28110 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
28120 20 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70      isNot = pExp
28130 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54  r->op2==TK_ISNOT
28140 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28150 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69  pExpr->eX==EX_Ri
28160 67 68 74 20 29 3b 0a 20 20 20 20 20 20 69 73 54  ght );.      isT
28170 72 75 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rue = sqlite3Exp
28180 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
28190 72 2d 3e 78 2e 70 52 69 67 68 74 29 3b 0a 20 20  r->x.pRight);.  
281a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
281b0 54 72 75 65 20 26 26 20 69 73 4e 6f 74 20 29 3b  True && isNot );
281c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
281d0 20 21 69 73 54 72 75 65 20 26 26 20 69 73 4e 6f   !isTrue && isNo
281e0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  t );.      if( i
281f0 73 54 72 75 65 20 5e 20 69 73 4e 6f 74 20 29 7b  sTrue ^ isNot ){
28200 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 54  .        /* IS T
28210 52 55 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 46  RUE and IS NOT F
28220 41 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ALSE */.        
28230 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28240 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
28250 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20  ->pLeft, dest,. 
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28270 20 20 20 20 20 20 20 20 20 20 69 73 4e 6f 74 20            isNot 
28280 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d  ? 0 : SQLITE_JUM
28290 50 49 46 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 20  PIFNULL);..     
282a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
282b0 2f 2a 20 49 53 20 46 41 4c 53 45 20 61 6e 64 20  /* IS FALSE and 
282c0 49 53 20 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20  IS NOT TRUE */. 
282d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
282e0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
282f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
28300 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
28320 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51 4c 49 54  sNot ? 0 : SQLIT
28330 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
28340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
28350 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
28360 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
28370 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20  se TK_ISNOT:.   
28380 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
28390 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
283a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
283b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
283c0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70  SNOT );.      op
283d0 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
283e0 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
283f0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d  TK_EQ;.      jum
28400 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45  pIfNull = SQLITE
28410 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
28420 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
28430 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
28440 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
28450 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
28460 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
28470 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
28480 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
28490 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
284a0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
284b0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67  Expr->pLeft) ) g
284c0 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72  oto default_expr
284d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
284e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
284f0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
28500 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
28510 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
28520 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
28530 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
28540 28 20 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f  ( pExpr->eX==EX_
28550 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 72  Right );.      r
28560 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
28570 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
28580 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c  pExpr->x.pRight,
28590 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
285a0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
285b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
285c0 65 66 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52  eft, pExpr->x.pR
285d0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
285e0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
285f0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
28600 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
28610 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
28620 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
28630 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
28640 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
28650 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
28660 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
28670 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
28680 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
28690 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
286a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
286b0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
286c0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
286d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
286e0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
286f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
28700 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
28710 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
28720 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
28730 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
28740 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
28750 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
28760 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  ase(op==OP_Eq);.
28770 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
28780 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45  geIf(v, op==OP_E
28790 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  q && jumpIfNull!
287a0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
287b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
287c0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
287d0 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Eq && jumpIfNull
287e0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
287f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
28800 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
28810 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
28820 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
28830 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
28840 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Ne && jumpIfNu
28850 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll!=SQLITE_NULLE
28860 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
28870 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
28880 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Ne && jumpIfN
28890 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull==SQLITE_NULL
288a0 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  EQ);.      testc
288b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
288c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
288d0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
288e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
288f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
28900 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
28910 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
28920 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
28930 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
28940 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
28950 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
28960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
28980 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
28990 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
289a0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
289b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
289c0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
289d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
289e0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
289f0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
28a00 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
28a10 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
28a20 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
28a30 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
28a40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
28a50 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
28a60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28a70 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
28a80 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
28a90 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
28aa0 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71 6c 69  Expr, dest, sqli
28ab0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 2c 20  te3ExprIfFalse, 
28ac0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
28ad0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28ae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28af0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
28b00 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
28b10 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
28b20 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
28b30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
28b40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28b50 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
28b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28b70 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
28b80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28b90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
28ba0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
28bb0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
28bc0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
28bd0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
28be0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28bf0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
28c00 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
28c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28c20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
28c30 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66  fault: {.    def
28c40 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20 20 20  ault_expr: .    
28c50 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
28c60 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
28c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28c80 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
28c90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28ca0 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
28cb0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
28cc0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
28cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28ce0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
28cf0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
28d00 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
28d10 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
28d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28d30 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
28d40 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
28d50 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
28d60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
28d70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
28d80 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
28d90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28da0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
28db0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
28dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28dd0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
28de0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
28df0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
28e00 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
28e10 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
28e20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
28e30 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33  .** Like sqlite3
28e40 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65 78  ExprIfFalse() ex
28e50 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70 79  cept that a copy
28e60 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70   is made of pExp
28e70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65  r before.** code
28e80 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64   generation, and
28e90 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64 65   that copy is de
28ea0 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64 65  leted after code
28eb0 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69   generation. Thi
28ec0 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61  s.** ensures tha
28ed0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
28ee0 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65  Expr is unchange
28ef0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28f00 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
28f10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28f20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
28f30 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66   dest,int jumpIf
28f40 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  Null){.  sqlite3
28f50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
28f60 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79  b;.  Expr *pCopy
28f70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
28f80 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
28f90 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
28fa0 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
28fb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
28fc0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f  alse(pParse, pCo
28fd0 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  py, dest, jumpIf
28fe0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
28ff0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
29000 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 2f 2a  b, pCopy);.}../*
29010 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
29020 56 61 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  Var is guarantee
29030 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 76  d to be an SQL v
29040 61 72 69 61 62 6c 65 2e 20 70 45 78 70 72 20 6d  ariable. pExpr m
29050 61 79 20 62 65 20 61 6e 79 0a 2a 2a 20 74 79 70  ay be any.** typ
29060 65 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2e  e of expression.
29070 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
29080 69 73 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20  is a simple SQL 
29090 76 61 6c 75 65 20 2d 20 61 6e 20 69 6e 74 65 67  value - an integ
290a0 65 72 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67  er, real, string
290b0 2c 20 62 6c 6f 62 0a 2a 2a 20 6f 72 20 4e 55 4c  , blob.** or NUL
290c0 4c 20 76 61 6c 75 65 20 2d 20 74 68 65 6e 20 74  L value - then t
290d0 68 65 20 56 44 42 45 20 63 75 72 72 65 6e 74 6c  he VDBE currentl
290e0 79 20 62 65 69 6e 67 20 70 72 65 70 61 72 65 64  y being prepared
290f0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a   is configured.*
29100 2a 20 74 6f 20 72 65 2d 70 72 65 70 61 72 65 20  * to re-prepare 
29110 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
29120 76 61 6c 75 65 20 69 73 20 62 6f 75 6e 64 20 74  value is bound t
29130 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72 2e  o variable pVar.
29140 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
29150 6c 6c 79 2c 20 69 66 20 70 45 78 70 72 20 69 73  lly, if pExpr is
29160 20 61 20 73 69 6d 70 6c 65 20 53 51 4c 20 76 61   a simple SQL va
29170 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c 75  lue and the valu
29180 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  e is the.** same
29190 20 61 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   as that current
291a0 6c 79 20 62 6f 75 6e 64 20 74 6f 20 76 61 72 69  ly bound to vari
291b0 61 62 6c 65 20 70 56 61 72 2c 20 6e 6f 6e 2d 7a  able pVar, non-z
291c0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
291d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
291e0 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
291f0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 6f 72   not the same or
29200 20 69 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74   if pExpr is not
29210 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 53 51 4c   a simple.** SQL
29220 20 76 61 6c 75 65 2c 20 7a 65 72 6f 20 69 73 20   value, zero is 
29230 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
29240 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 6d 70  tic int exprComp
29250 61 72 65 56 61 72 69 61 62 6c 65 28 50 61 72 73  areVariable(Pars
29260 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
29270 2a 70 56 61 72 2c 20 45 78 70 72 20 2a 70 45 78  *pVar, Expr *pEx
29280 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  pr){.  int res =
29290 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 72 3b 0a   0;.  int iVar;.
292a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
292b0 2a 70 4c 2c 20 2a 70 52 20 3d 20 30 3b 0a 20 20  *pL, *pR = 0;.  
292c0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
292d0 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2d 3e  romExpr(pParse->
292e0 64 62 2c 20 70 45 78 70 72 2c 20 53 51 4c 49 54  db, pExpr, SQLIT
292f0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
29300 46 46 5f 42 4c 4f 42 2c 20 26 70 52 29 3b 0a 20  FF_BLOB, &pR);. 
29310 20 69 66 28 20 70 52 20 29 7b 0a 20 20 20 20 69   if( pR ){.    i
29320 56 61 72 20 3d 20 70 56 61 72 2d 3e 69 43 6f 6c  Var = pVar->iCol
29330 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
29340 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
29350 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
29360 61 72 29 3b 0a 20 20 20 20 70 4c 20 3d 20 73 71  ar);.    pL = sq
29370 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
29380 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
29390 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
293a0 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
293b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 20 29 7b  );.    if( pL ){
293c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
293d0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4c  e3_value_type(pL
293e0 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  )==SQLITE_TEXT )
293f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29400 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4c 29  3_value_text(pL)
29410 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ; /* Make sure t
29420 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  he encoding is U
29430 54 46 2d 38 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  TF-8 */.      }.
29440 20 20 20 20 20 20 72 65 73 20 3d 20 20 30 3d 3d        res =  0==
29450 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
29460 65 28 70 4c 2c 20 70 52 2c 20 30 29 3b 0a 20 20  e(pL, pR, 0);.  
29470 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
29480 61 6c 75 65 46 72 65 65 28 70 52 29 3b 0a 20 20  alueFree(pR);.  
29490 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
294a0 65 65 28 70 4c 29 3b 0a 20 20 7d 0a 0a 20 20 72  ee(pL);.  }..  r
294b0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
294c0 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
294d0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
294e0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
294f0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
29500 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
29510 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65  sions are comple
29520 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20  tely identical. 
29530 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29540 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a  y differ only.**
29550 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
29560 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f  erator at the to
29570 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e  p level.  Return
29580 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20   2 if there are 
29590 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f  differences.** o
295a0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f  ther than the to
295b0 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20  p-level COLLATE 
295c0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
295d0 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
295e0 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
295f0 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
29600 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
29610 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
29620 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
29630 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
29640 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
29650 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
29660 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69  * The pA side mi
29670 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f  ght be using TK_
29680 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68  REGISTER.  If th
29690 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61  at is the case a
296a0 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20  nd pB is.** not 
296b0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
296c0 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  R but is otherwi
296d0 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74  se equivalent, t
296e0 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
296f0 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69   0..**.** Someti
29700 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
29710 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65   will return 2 e
29720 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
29730 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
29740 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
29750 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
29760 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
29770 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
29780 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
29790 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74  we return 2 just
297a0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
297b0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
297c0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74  .** returns 2, t
297d0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
297e0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
297f0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
29800 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
29810 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
29820 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
29830 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20   0 or 1 return, 
29840 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
29850 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
29860 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
29870 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
29880 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
29890 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
298a0 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
298b0 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
298c0 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a  xtra 2 - that.**
298d0 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
298e0 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
298f0 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
29900 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
29910 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
29920 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61  0 or 1 could lea
29930 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
29940 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61  on..**.** If pPa
29950 72 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  rse is not NULL 
29960 74 68 65 6e 20 54 4b 5f 56 41 52 49 41 42 4c 45  then TK_VARIABLE
29970 20 74 65 72 6d 73 20 69 6e 20 70 41 20 77 69 74   terms in pA wit
29980 68 20 62 69 6e 64 69 6e 67 73 20 69 6e 0a 2a 2a  h bindings in.**
29990 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70   pParse->pReprep
299a0 61 72 65 20 63 61 6e 20 62 65 20 6d 61 74 63 68  are can be match
299b0 65 64 20 61 67 61 69 6e 73 74 20 6c 69 74 65 72  ed against liter
299c0 61 6c 73 20 69 6e 20 70 42 2e 20 20 54 68 65 20  als in pB.  The 
299d0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 70 56 64 62  .** pParse->pVdb
299e0 65 2d 3e 65 78 70 6d 61 73 6b 20 62 69 74 6d 61  e->expmask bitma
299f0 73 6b 20 69 73 20 75 70 64 61 74 65 64 20 66 6f  sk is updated fo
29a00 72 20 65 61 63 68 20 76 61 72 69 61 62 6c 65 20  r each variable 
29a10 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 49  referenced..** I
29a20 66 20 70 50 61 72 73 65 20 69 73 20 4e 55 4c 4c  f pParse is NULL
29a30 20 28 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73   (the normal cas
29a40 65 29 20 74 68 65 6e 20 61 6e 79 20 54 4b 5f 56  e) then any TK_V
29a50 41 52 49 41 42 4c 45 20 74 65 72 6d 20 69 6e 20  ARIABLE term in 
29a60 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 50 61  .** Argument pPa
29a70 72 73 65 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  rse should norma
29a80 6c 6c 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  lly be NULL. If 
29a90 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  it is not NULL a
29aa0 6e 64 20 70 41 20 6f 72 0a 2a 2a 20 70 42 20 63  nd pA or.** pB c
29ab0 61 75 73 65 73 20 61 20 72 65 74 75 72 6e 20 76  auses a return v
29ac0 61 6c 75 65 20 6f 66 20 32 2e 0a 2a 2f 0a 69 6e  alue of 2..*/.in
29ad0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
29ae0 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
29af0 73 65 2c 20 45 78 70 72 20 2a 70 41 2c 20 45 78  se, Expr *pA, Ex
29b00 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
29b10 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
29b20 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
29b30 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
29b40 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
29b50 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
29b60 20 69 66 28 20 70 50 61 72 73 65 20 26 26 20 70   if( pParse && p
29b70 41 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  A->op==TK_VARIAB
29b80 4c 45 20 26 26 20 65 78 70 72 43 6f 6d 70 61 72  LE && exprCompar
29b90 65 56 61 72 69 61 62 6c 65 28 70 50 61 72 73 65  eVariable(pParse
29ba0 2c 20 70 41 2c 20 70 42 29 20 29 7b 0a 20 20 20  , pA, pB) ){.   
29bb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29bc0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
29bd0 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
29be0 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
29bf0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29c00 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
29c10 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
29c20 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
29c30 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
29c40 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
29c50 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
29c60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
29c70 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
29c80 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
29c90 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
29ca0 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
29cb0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
29cc0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
29cd0 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 70 42  se, pA->pLeft,pB
29ce0 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20  ,iTab)<2 ){.    
29cf0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29d00 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
29d10 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
29d20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
29d30 72 65 28 70 50 61 72 73 65 2c 20 70 41 2c 70 42  re(pParse, pA,pB
29d40 2d 3e 70 4c 65 66 74 2c 69 54 61 62 29 3c 32 20  ->pLeft,iTab)<2 
29d50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29d60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
29d70 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
29d80 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
29d90 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
29da0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
29db0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
29dc0 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
29dd0 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
29de0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
29df0 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
29e00 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
29e10 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
29e20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
29e30 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
29e40 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  E ){.      if( s
29e50 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
29e60 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
29e70 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
29e80 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
29e90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
29ea0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
29eb0 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
29ec0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
29ed0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
29ee0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
29ef0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
29f00 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
29f10 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
29f20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
29f30 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
29f40 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
29f50 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 65  ){.    if( pA->e
29f60 58 3d 3d 45 58 5f 53 65 6c 65 63 74 20 7c 7c 20  X==EX_Select || 
29f70 70 41 2d 3e 65 58 21 3d 70 42 2d 3e 65 58 20 29  pA->eX!=pB->eX )
29f80 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
29f90 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
29fa0 73 20 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  s & EP_FixedCol)
29fb0 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
29fc0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
29fd0 50 61 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74  Parse, pA->pLeft
29fe0 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
29ff0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
2a000 20 20 20 69 66 28 20 70 41 2d 3e 65 58 3d 3d 45     if( pA->eX==E
2a010 58 5f 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  X_Right ){.     
2a020 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2a030 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 70  Compare(pParse,p
2a040 41 2d 3e 78 2e 70 52 69 67 68 74 2c 70 42 2d 3e  A->x.pRight,pB->
2a050 78 2e 70 52 69 67 68 74 2c 69 54 61 62 29 20 29  x.pRight,iTab) )
2a060 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
2a070 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 65 58 3d  .    if( pA->eX=
2a080 3d 45 58 5f 4c 69 73 74 20 29 7b 0a 20 20 20 20  =EX_List ){.    
2a090 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2a0a0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
2a0b0 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
2a0c0 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
2a0d0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
2a0e0 20 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62     assert( (comb
2a0f0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
2a100 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
2a110 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
2a120 5f 53 54 52 49 4e 47 20 26 26 20 70 41 2d 3e 6f  _STRING && pA->o
2a130 70 21 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  p!=TK_TRUEFALSE 
2a140 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
2a150 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
2a160 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
2a170 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
2a180 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
2a190 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
2a1a0 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
2a1b0 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
2a1c0 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
2a1d0 6e 20 32 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  n 2;.    }.#ifnd
2a1e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2a1f0 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 2f 2a  INDOWFUNC.    /*
2a200 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   Justification f
2a210 6f 72 20 74 68 65 20 61 73 73 65 72 74 28 29 3a  or the assert():
2a220 0a 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66  .    ** window f
2a230 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 70 2d  unctions have p-
2a240 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
2a250 20 62 75 74 20 61 67 67 72 65 67 61 74 65 20 66   but aggregate f
2a260 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  unctions.    ** 
2a270 68 61 76 65 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  have p->op==TK_A
2a280 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 20 20 53 6f  GG_FUNCTION.  So
2a290 20 61 6e 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20   any comparison 
2a2a0 62 65 74 77 65 65 6e 20 61 6e 20 61 67 67 72 65  between an aggre
2a2b0 67 61 74 65 0a 20 20 20 20 2a 2a 20 66 75 6e 63  gate.    ** func
2a2c0 74 69 6f 6e 20 61 6e 64 20 61 20 77 69 6e 64 6f  tion and a windo
2a2d0 77 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  w function shoul
2a2e0 64 20 68 61 76 65 20 66 61 69 6c 65 64 20 62 65  d have failed be
2a2f0 66 6f 72 65 20 72 65 61 63 68 69 6e 67 0a 20 20  fore reaching.  
2a300 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 2e    ** this point.
2a310 20 20 41 6e 64 2c 20 69 74 20 69 73 20 6e 6f 74    And, it is not
2a320 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
2a330 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  e a window funct
2a340 69 6f 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ion and.    ** a
2a350 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
2a360 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2a370 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ame and number o
2a380 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 6f  f arguments.  So
2a390 0a 20 20 20 20 2a 2a 20 69 66 20 77 65 20 72 65  .    ** if we re
2a3a0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
2a3b0 65 69 74 68 65 72 20 41 20 61 6e 64 20 42 20 62  either A and B b
2a3c0 6f 74 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  oth window funct
2a3d0 69 6f 6e 73 20 6f 72 0a 20 20 20 20 2a 2a 20 6e  ions or.    ** n
2a3e0 65 69 74 68 65 72 20 61 72 65 20 61 20 77 69 6e  either are a win
2a3f0 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a  dow functions. *
2a400 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
2a410 41 2d 3e 70 57 69 6e 3d 3d 30 29 3d 3d 28 70 42  A->pWin==0)==(pB
2a420 2d 3e 70 57 69 6e 3d 3d 30 29 20 29 3b 0a 0a 20  ->pWin==0) );.. 
2a430 20 20 20 69 66 28 20 70 41 2d 3e 70 57 69 6e 21     if( pA->pWin!
2a440 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2a450 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
2a460 70 61 72 65 28 70 50 61 72 73 65 2c 70 41 2d 3e  pare(pParse,pA->
2a470 70 57 69 6e 2c 70 42 2d 3e 70 57 69 6e 29 21 3d  pWin,pB->pWin)!=
2a480 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  0 ) return 2;.  
2a490 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
2a4a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2a4b0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
2a4c0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2a4d0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
2a4e0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
2a4f0 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
2a500 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
2a510 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
2a520 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
2a530 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
2a540 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
2a550 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
2a560 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
2a570 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
2a580 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
2a590 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
2a5a0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
2a5b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a5c0 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
2a5d0 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
2a5e0 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
2a5f0 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
2a600 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
2a610 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
2a620 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
2a630 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2a640 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
2a650 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
2a660 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
2a670 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
2a680 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
2a690 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
2a6a0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
2a6b0 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
2a6c0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
2a6d0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
2a6e0 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
2a6f0 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
2a700 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
2a710 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
2a720 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2a730 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
2a740 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
2a750 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
2a760 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
2a770 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
2a780 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
2a790 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
2a7a0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
2a7b0 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
2a7c0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
2a7d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
2a7e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2a7f0 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
2a800 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
2a810 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
2a820 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
2a830 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
2a840 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
2a850 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2a860 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2a870 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2a880 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72  Compare(0, pExpr
2a890 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
2a8a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
2a8b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2a8c0 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
2a8d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 29 20  e3ExprCompare() 
2a8e0 65 78 63 65 70 74 20 43 4f 4c 4c 41 54 45 20 6f  except COLLATE o
2a8f0 70 65 72 61 74 6f 72 73 20 61 74 20 74 68 65 20  perators at the 
2a900 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 61 72 65  top-level.** are
2a910 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74   ignored..*/.int
2a920 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2a930 61 72 65 53 6b 69 70 28 45 78 70 72 20 2a 70 41  areSkip(Expr *pA
2a940 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
2a950 69 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  iTab){.  return 
2a960 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
2a970 72 65 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20  re(0,.          
2a980 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b     sqlite3ExprSk
2a990 69 70 43 6f 6c 6c 61 74 65 28 70 41 29 2c 0a 20  ipCollate(pA),. 
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a9b0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2a9c0 74 65 28 70 42 29 2c 0a 20 20 20 20 20 20 20 20  te(pB),.        
2a9d0 20 20 20 20 20 69 54 61 62 29 3b 0a 7d 0a 0a 2f       iTab);.}../
2a9e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2a9f0 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
2aa00 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
2aa10 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
2aa20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
2aa30 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2aa40 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
2aa50 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
2aa60 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
2aa70 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
2aa80 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
2aa90 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
2aaa0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2aab0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
2aac0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2aad0 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
2aae0 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2aaf0 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
2ab00 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
2ab10 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
2ab20 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
2ab30 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2ab40 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
2ab50 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2ab60 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2ab70 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2ab80 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
2ab90 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2aba0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2abb0 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
2abc0 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
2abd0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2abe0 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
2abf0 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
2ac00 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2ac10 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
2ac20 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
2ac30 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
2ac40 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
2ac50 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
2ac60 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
2ac70 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
2ac80 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
2ac90 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
2aca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
2acb0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
2acc0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f  hen the values o
2acd0 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  f bound variable
2ace0 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a  s in pE1 are .**
2acf0 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73   compared agains
2ad00 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
2ad10 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72   in pE2 and pPar
2ad20 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2ad30 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65  sk is.** modifie
2ad40 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63  d to record whic
2ad50 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  h bound variable
2ad60 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  s are referenced
2ad70 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a  .  If pParse .**
2ad80 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66   is NULL, then f
2ad90 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74  alse will be ret
2ada0 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e  urned if pE1 con
2adb0 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20  tains any bound 
2adc0 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
2add0 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
2ade0 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
2adf0 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
2ae00 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
2ae10 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
2ae20 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
2ae30 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
2ae40 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
2ae50 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
2ae60 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
2ae70 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
2ae80 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
2ae90 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
2aea0 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
2aeb0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2aec0 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
2aed0 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
2aee0 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
2aef0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2af00 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2af10 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54  se, pE1, pE2, iT
2af20 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
2af30 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
2af40 73 65 72 74 28 20 70 45 32 2d 3e 6f 70 21 3d 54  sert( pE2->op!=T
2af50 4b 5f 4f 52 20 7c 7c 20 70 45 32 2d 3e 65 58 3d  K_OR || pE2->eX=
2af60 3d 45 58 5f 52 69 67 68 74 20 29 3b 0a 20 20 69  =EX_Right );.  i
2af70 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
2af80 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
2af90 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
2afa0 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32  pParse, pE1, pE2
2afb0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2afd0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2afe0 73 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  sExpr(pParse, pE
2aff0 31 2c 20 70 45 32 2d 3e 78 2e 70 52 69 67 68 74  1, pE2->x.pRight
2b000 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
2b010 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2b020 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
2b030 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 26 26 20 70 45  TK_NOTNULL && pE
2b040 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  1->op!=TK_ISNULL
2b050 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
2b060 49 53 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  IS ){.    Expr *
2b070 70 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pX = sqlite3Expr
2b080 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 31 2d  SkipCollate(pE1-
2b090 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 74 65 73  >pLeft);.    tes
2b0a0 74 63 61 73 65 28 20 70 58 21 3d 70 45 31 2d 3e  tcase( pX!=pE1->
2b0b0 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 69 66 28  pLeft );.    if(
2b0c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2b0d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 58 2c 20  are(pParse, pX, 
2b0e0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
2b0f0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2b100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2b110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
2b120 73 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20  s the Expr node 
2b130 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c  callback for sql
2b140 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e  ite3ExprImpliesN
2b150 6f 74 4e 75 6c 6c 52 6f 77 28 29 2e 0a 2a 2a 20  otNullRow()..** 
2b160 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2b170 6e 20 6e 6f 64 65 20 72 65 71 75 69 72 65 73 20  n node requires 
2b180 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 61  that the table a
2b190 74 20 70 57 61 6c 6b 65 72 2d 3e 69 43 75 72 0a  t pWalker->iCur.
2b1a0 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55  ** have a non-NU
2b1b0 4c 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20  LL column, then 
2b1c0 73 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  set pWalker->eCo
2b1d0 64 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72  de to 1 and abor
2b1e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2b1f0 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52   impliesNotNullR
2b200 6f 77 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ow(Walker *pWalk
2b210 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2b220 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  {.  /* This rout
2b230 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
2b240 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
2b250 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  use expressions 
2b260 61 6e 64 20 73 6f 20 69 74 0a 20 20 2a 2a 20 63  and so it.  ** c
2b270 61 6e 6e 6f 74 20 68 61 76 65 20 61 6e 79 20 54  annot have any T
2b280 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 65 6e 74  K_AGG_COLUMN ent
2b290 72 69 65 73 20 62 65 63 61 75 73 65 20 74 68 6f  ries because tho
2b2a0 73 65 20 61 72 65 20 6f 6e 6c 79 20 66 6f 75 6e  se are only foun
2b2b0 64 0a 20 20 2a 2a 20 69 6e 20 48 41 56 49 4e 47  d.  ** in HAVING
2b2c0 20 63 6c 61 75 73 65 73 2e 20 20 57 65 20 63 61   clauses.  We ca
2b2d0 6e 20 67 65 74 20 61 20 54 4b 5f 41 47 47 5f 46  n get a TK_AGG_F
2b2e0 55 4e 43 54 49 4f 4e 20 69 6e 20 61 20 57 48 45  UNCTION in a WHE
2b2f0 52 45 20 63 6c 61 75 73 65 2c 0a 20 20 2a 2a 20  RE clause,.  ** 
2b300 62 75 74 20 74 68 61 74 20 69 73 20 61 6e 20 69  but that is an i
2b310 6c 6c 65 67 61 6c 20 63 6f 6e 73 74 72 75 63 74  llegal construct
2b320 20 61 6e 64 20 74 68 65 20 71 75 65 72 79 20 77   and the query w
2b330 69 6c 6c 20 62 65 20 72 65 6a 65 63 74 65 64 20  ill be rejected 
2b340 61 74 0a 20 20 2a 2a 20 61 20 6c 61 74 65 72 20  at.  ** a later 
2b350 73 74 61 67 65 20 6f 66 20 70 72 6f 63 65 73 73  stage of process
2b360 69 6e 67 2c 20 73 6f 20 74 68 65 20 54 4b 5f 41  ing, so the TK_A
2b370 47 47 5f 46 55 4e 43 54 49 4f 4e 20 63 61 73 65  GG_FUNCTION case
2b380 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e   does not.  ** n
2b390 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
2b3a0 65 72 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  ered here. */.  
2b3b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2b3c0 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
2b3d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b3e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
2b3f0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 0a 20  G_FUNCTION );.. 
2b400 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2b410 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
2b420 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
2b430 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73  n WRC_Prune;.  s
2b440 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
2b450 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
2b460 49 53 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ISNOT:.    case 
2b470 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
2b480 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2b490 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
2b4a0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
2b4b0 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 0a 20 20  case TK_CASE:.  
2b4c0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20    case TK_IN:.  
2b4d0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2b4e0 4f 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  ON:.      testca
2b4f0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2b500 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
2b510 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2b520 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ->op==TK_NOT );.
2b530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b540 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
2b550 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
2b560 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
2b570 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
2b580 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2b590 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  r->op==TK_OR );.
2b5a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b5b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41  pExpr->op==TK_CA
2b5c0 53 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  SE );.      test
2b5d0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
2b5e0 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =TK_IN );.      
2b5f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2b600 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
2b610 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
2b620 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2b630 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
2b640 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
2b650 72 2d 3e 75 2e 69 43 75 72 3d 3d 70 45 78 70 72  r->u.iCur==pExpr
2b660 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
2b670 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2b680 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2b690 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b6a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b6b0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2b6c0 3b 0a 0a 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;..    /* Virtua
2b6d0 6c 20 74 61 62 6c 65 73 20 61 72 65 20 61 6c 6c  l tables are all
2b6e0 6f 77 65 64 20 74 6f 20 75 73 65 20 63 6f 6e 73  owed to use cons
2b6f0 74 72 61 69 6e 74 73 20 6c 69 6b 65 20 78 3d 4e  traints like x=N
2b700 55 4c 4c 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  ULL.  So.    ** 
2b710 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  a term of the fo
2b720 72 6d 20 78 3d 79 20 64 6f 65 73 20 6e 6f 74 20  rm x=y does not 
2b730 70 72 6f 76 65 20 74 68 61 74 20 79 20 69 73 20  prove that y is 
2b740 6e 6f 74 20 6e 75 6c 6c 20 69 66 20 78 0a 20 20  not null if x.  
2b750 20 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75    ** is the colu
2b760 6d 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  mn of a virtual 
2b770 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  table */.    cas
2b780 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73  e TK_EQ:.    cas
2b790 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
2b7a0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
2b7b0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
2b7c0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
2b7d0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20 74  e TK_GE:.      t
2b7e0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b7f0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
2b800 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b810 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  pr->op==TK_NE );
2b820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2b830 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
2b840 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
2b850 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2b860 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_LE );.      t
2b870 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2b880 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
2b890 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2b8a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  pr->op==TK_GE );
2b8b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b8c0 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 52 69 67  Expr->eX==EX_Rig
2b8d0 68 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ht );.      if( 
2b8e0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f  (pExpr->pLeft->o
2b8f0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
2b900 49 73 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d  IsVirtual(pExpr-
2b910 3e 70 4c 65 66 74 2d 3e 78 2e 70 54 61 62 29 29  >pLeft->x.pTab))
2b920 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70  .       || (pExp
2b930 72 2d 3e 78 2e 70 52 69 67 68 74 2d 3e 6f 70 3d  r->x.pRight->op=
2b940 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73  =TK_COLUMN && Is
2b950 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e 78  Virtual(pExpr->x
2b960 2e 70 52 69 67 68 74 2d 3e 78 2e 70 54 61 62 29  .pRight->x.pTab)
2b970 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2b980 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2b990 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
2b9a0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
2b9b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2b9c0 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ue;.  }.}../*.**
2b9d0 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
2b9e0 6e 2d 7a 65 72 6f 29 20 69 66 20 65 78 70 72 65  n-zero) if expre
2b9f0 73 73 69 6f 6e 20 70 20 63 61 6e 20 6f 6e 6c 79  ssion p can only
2ba00 20 62 65 20 74 72 75 65 20 69 66 20 61 74 20 6c   be true if at l
2ba10 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75  east.** one colu
2ba20 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54 61 62  mn of table iTab
2ba30 20 69 73 20 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49   is non-null.  I
2ba40 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
2ba50 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
2ba60 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
2ba70 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 4e 55 4c  ll always be NUL
2ba80 4c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 65 76  L or false if ev
2ba90 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54  ery column of iT
2baa0 61 62 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a  ab.** is NULL..*
2bab0 2a 0a 2a 2a 20 46 61 6c 73 65 20 6e 65 67 61 74  *.** False negat
2bac0 69 76 65 73 20 61 72 65 20 61 63 63 65 70 74 61  ives are accepta
2bad0 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
2bae0 6f 72 64 73 2c 20 69 74 20 69 73 20 6f 6b 20 74  ords, it is ok t
2baf0 6f 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  o return.** zero
2bb00 20 65 76 65 6e 20 69 66 20 65 78 70 72 65 73 73   even if express
2bb10 69 6f 6e 20 70 20 77 69 6c 6c 20 6e 65 76 65 72  ion p will never
2bb20 20 62 65 20 74 72 75 65 20 6f 66 20 65 76 65 72   be true of ever
2bb30 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62  y column of iTab
2bb40 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20  .** is NULL.  A 
2bb50 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 69  false negative i
2bb60 73 20 6d 65 72 65 6c 79 20 61 20 6d 69 73 73 65  s merely a misse
2bb70 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  d optimization o
2bb80 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a  pportunity..**.*
2bb90 2a 20 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65  * False positive
2bba0 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
2bbb0 64 2c 20 68 6f 77 65 76 65 72 2e 20 20 41 20 66  d, however.  A f
2bbc0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 20 6d 61  alse positive ma
2bbd0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
2bbe0 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
2bbf0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  er..**.** Terms 
2bc00 6f 66 20 70 20 74 68 61 74 20 61 72 65 20 6d 61  of p that are ma
2bc10 72 6b 65 64 20 77 69 74 68 20 45 50 5f 46 72 6f  rked with EP_Fro
2bc20 6d 4a 6f 69 6e 20 28 61 6e 64 20 68 65 6e 63 65  mJoin (and hence
2bc30 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 0a   that come from.
2bc40 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
2bc50 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 4c 45  NG clauses of LE
2bc60 46 54 20 4a 4f 49 4e 53 29 20 61 72 65 20 65 78  FT JOINS) are ex
2bc70 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cluded from the 
2bc80 61 6e 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20  analysis..**.** 
2bc90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2bca0 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
2bcb0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
2bcc0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2bcd0 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
2bce0 79 20 4a 4f 49 4e 2e 20 20 54 68 65 20 70 20 61  y JOIN.  The p a
2bcf0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 57  rgument is the W
2bd00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 49 66  HERE clause.  If
2bd10 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2bd20 61 75 73 65 20 72 65 71 75 69 72 65 73 20 74 68  ause requires th
2bd30 61 74 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f  at some column o
2bd40 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
2bd50 65 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  e of the LEFT JO
2bd60 49 4e 0a 2a 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c  IN.** be non-NUL
2bd70 4c 2c 20 74 68 65 6e 20 74 68 65 20 4c 45 46 54  L, then the LEFT
2bd80 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20 73 61 66   JOIN can be saf
2bd90 65 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  ely converted in
2bda0 74 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  to an.** ordinar
2bdb0 79 20 6a 6f 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  y join..*/.int s
2bdc0 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2bdd0 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 45 78 70 72  sNonNullRow(Expr
2bde0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a   *p, int iTab){.
2bdf0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
2be00 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2be10 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52 6f  impliesNotNullRo
2be20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2be30 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
2be40 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2be50 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20   = 0;.  w.eCode 
2be60 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  = 0;.  w.u.iCur 
2be70 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  = iTab;.  sqlite
2be80 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
2be90 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
2bea0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  de;.}../*.** An 
2beb0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2bec0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2bed0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
2bee0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
2bef0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  * to determine i
2bf00 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2bf10 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
2bf20 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f   by reference to
2bf30 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e   the.** index on
2bf40 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69  ly, without havi
2bf50 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63  ng to do a searc
2bf60 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73  h for the corres
2bf70 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65  ponding.** table
2bf80 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78   entry.  The Idx
2bf90 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64  Cover.pIdx field
2bfa0 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20   is the index.  
2bfb0 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a  IdxCover.iCur.**
2bfc0 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
2bfd0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  or the table..*/
2bfe0 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65 72  .struct IdxCover
2bff0 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78   {.  Index *pIdx
2c000 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  ;     /* The ind
2c010 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64 20  ex to be tested 
2c020 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  for coverage */.
2c030 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20    int iCur;     
2c040 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
2c050 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
2c060 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2c070 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  to the index */.
2c080 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  };../*.** Check 
2c090 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2c0a0 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  are references t
2c0b0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  o columns in tab
2c0c0 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  le .** pWalker->
2c0d0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75  u.pIdxCover->iCu
2c0e0 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  r can be satisfi
2c0f0 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
2c100 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75  ex.** pWalker->u
2c110 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78  .pIdxCover->pIdx
2c120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c130 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c  exprIdxCover(Wal
2c140 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2c150 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
2c160 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
2c170 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78  COLUMN.   && pEx
2c180 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
2c190 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
2c1a0 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c  ->iCur.   && sql
2c1b0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
2c1c0 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64  x(pWalker->u.pId
2c1d0 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45  xCover->pIdx, pE
2c1e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a  xpr->iColumn)<0.
2c1f0 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72    ){.    pWalker
2c200 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2c210 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2c220 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2c230 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2c240 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2c250 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64   if an index pId
2c260 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20  x on table with 
2c270 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74  cursor iCur cont
2c280 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65  ains will.** the
2c290 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
2c2a0 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
2c2b0 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65  if the index doe
2c2c0 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65  s cover the.** e
2c2d0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61  xpression and fa
2c2e0 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70 72  lse if the pExpr
2c2f0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65   expression refe
2c300 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c  rences table col
2c310 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  umns.** that are
2c320 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68   not found in th
2c330 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a  e index pIdx..**
2c340 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76  .** An index cov
2c350 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  ering an express
2c360 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ion means that t
2c370 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
2c380 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65  n be.** evaluate
2c390 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65  d using only the
2c3a0 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f   index and witho
2c3b0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f  ut having to loo
2c3c0 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  kup the.** corre
2c3d0 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65  sponding table e
2c3e0 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ntry..*/.int sql
2c3f0 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64 42  ite3ExprCoveredB
2c400 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a  yIndex(.  Expr *
2c410 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
2c420 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
2c430 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74   tested */.  int
2c440 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
2c450 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e   /* The cursor n
2c460 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f  umber for the co
2c470 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2c480 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
2c490 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  dx         /* Th
2c4a0 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67  e index that mig
2c4b0 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 63  ht be used for c
2c4c0 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  overage */.){.  
2c4d0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
2c4e0 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76  ct IdxCover xcov
2c4f0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
2c500 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
2c510 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72  xcov.iCur = iCur
2c520 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20  ;.  xcov.pIdx = 
2c530 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43  pIdx;.  w.xExprC
2c540 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64  allback = exprId
2c550 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49  xCover;.  w.u.pI
2c560 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b  dxCover = &xcov;
2c570 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2c580 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20  pr(&w, pExpr);. 
2c590 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65   return !w.eCode
2c5a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.}.../*.** An i
2c5b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2c5c0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2c5d0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
2c5e0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
2c5f0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
2c600 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
2c610 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
2c620 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
2c630 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2c640 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
2c650 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
2c660 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
2c670 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
2c680 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
2c690 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
2c6a0 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
2c6b0 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
2c6c0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
2c6d0 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
2c6e0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
2c6f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2c700 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
2c710 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
2c720 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
2c730 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
2c740 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2c750 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
2c760 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
2c770 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
2c780 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
2c790 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
2c7a0 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
2c7b0 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
2c7c0 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
2c7d0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2c7e0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
2c7f0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
2c800 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
2c810 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
2c820 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
2c830 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
2c840 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
2c850 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2c860 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
2c870 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
2c880 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
2c890 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
2c8a0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2c8b0 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
2c8c0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
2c8d0 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
2c8e0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
2c8f0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
2c900 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
2c910 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
2c920 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
2c930 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
2c940 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
2c950 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2c960 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
2c970 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
2c980 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
2c990 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
2c9a0 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
2c9b0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
2c9c0 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
2c9d0 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
2c9e0 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
2c9f0 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
2ca00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
2ca10 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
2ca20 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
2ca30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2ca40 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
2ca50 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
2ca60 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
2ca70 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
2ca80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ca90 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2caa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
2cab0 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
2cac0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
2cad0 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
2cae0 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
2caf0 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
2cb00 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
2cb10 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
2cb20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
2cb30 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
2cb40 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
2cb50 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
2cb60 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
2cb70 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
2cb80 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
2cb90 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
2cba0 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
2cbb0 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
2cbc0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2cbd0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
2cbe0 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
2cbf0 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
2cc00 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
2cc10 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
2cc20 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
2cc30 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
2cc40 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
2cc50 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2cc60 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e  ck = exprSrcCoun
2cc70 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  t;.  w.xSelectCa
2cc80 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77 2e  llback = 0;.  w.
2cc90 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
2cca0 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
2ccb0 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
2ccc0 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
2ccd0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
2cce0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
2ccf0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
2cd00 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
2cd10 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
2cd20 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
2cd30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
2cd40 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2cd50 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
2cd60 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2cd70 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2cd80 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2cd90 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2cda0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2cdb0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2cdc0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2cdd0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
2cde0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
2cdf0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
2ce00 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
2ce10 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
2ce20 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
2ce30 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
2ce40 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
2ce50 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
2ce60 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
2ce70 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
2ce80 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2ce90 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2cea0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2ceb0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2cec0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2ced0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
2cee0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
2cef0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
2cf00 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
2cf10 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2cf20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
2cf30 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
2cf40 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
2cf50 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
2cf60 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
2cf70 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
2cf80 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
2cf90 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
2cfa0 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
2cfb0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
2cfc0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
2cfd0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
2cfe0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
2cff0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
2d000 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
2d010 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2d020 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
2d030 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
2d040 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
2d050 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
2d060 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2d070 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
2d080 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
2d090 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2d0a0 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
2d0b0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2d0c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d0d0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
2d0e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2d0f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2d100 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
2d110 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
2d120 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
2d130 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2d140 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
2d150 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2d160 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2d170 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
2d180 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 75 4e 43  gInfo = pNC->uNC
2d190 2e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 61 73  .pAggInfo;..  as
2d1a0 73 65 72 74 28 20 70 4e 43 2d 3e 6e 63 46 6c 61  sert( pNC->ncFla
2d1b0 67 73 20 26 20 4e 43 5f 55 41 67 67 49 6e 66 6f  gs & NC_UAggInfo
2d1c0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   );.  switch( pE
2d1d0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
2d1e0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
2d1f0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
2d200 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
2d210 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2d220 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
2d230 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
2d240 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2d250 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
2d260 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
2d270 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
2d280 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
2d290 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2d2a0 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
2d2b0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
2d2c0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
2d2d0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
2d2e0 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
2d2f0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
2d300 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2d310 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
2d320 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2d330 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
2d340 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
2d350 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2d360 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2d370 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
2d380 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2d390 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2d3a0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2d3b0 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2d3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2d3d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
2d3e0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
2d3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2d400 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
2d410 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
2d420 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
2d430 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
2d440 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
2d450 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2d460 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
2d470 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
2d480 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2d490 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
2d4a0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
2d4b0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
2d4c0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
2d4d0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
2d4e0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
2d4f0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
2d500 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
2d510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2d520 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
2d530 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
2d540 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
2d550 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
2d560 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2d570 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
2d580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2d590 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
2d5a0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
2d5b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
2d5c0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
2d5d0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
2d5e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2d5f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d620 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
2d630 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
2d640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2d650 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
2d660 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
2d670 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
2d680 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2d690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d6a0 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
2d6b0 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
2d6c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d6d0 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 54 61  pExpr->eX==EX_Ta
2d6e0 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b );.           
2d6f0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
2d700 70 45 78 70 72 2d 3e 78 2e 70 54 61 62 3b 0a 20  pExpr->x.pTab;. 
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2d720 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
2d730 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
2d740 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2d750 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
2d760 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
2d770 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
2d780 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
2d790 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
2d7a0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
2d7b0 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
2d7c0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2d7d0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2d7f0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2d800 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
2d810 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
2d820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d830 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
2d840 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
2d850 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
2d860 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2d870 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
2d880 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
2d890 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
2d8a0 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
2d8b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
2d8c0 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
2d8d0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
2d8e0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
2d8f0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
2d900 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
2d910 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2d920 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
2d930 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
2d940 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d960 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
2d970 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
2d9a0 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
2d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d9d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d9f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2da00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2da10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2da20 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
2da30 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2da40 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
2da50 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
2da60 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
2da70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2da80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da90 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2daa0 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
2dab0 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
2dac0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
2dad0 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
2dae0 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
2daf0 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
2db00 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
2db10 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
2db20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
2db30 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
2db40 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
2db50 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
2db60 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
2db70 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
2db80 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
2db90 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2dba0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2dbb0 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
2dbc0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
2dbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
2dbe0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
2dbf0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
2dc00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
2dc10 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
2dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2dc30 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
2dc40 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
2dc50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2dc60 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
2dc70 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
2dc80 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
2dc90 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
2dca0 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
2dcb0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
2dcc0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2dcd0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  e;.    }.    cas
2dce0 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
2dcf0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28  N: {.      if( (
2dd00 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2dd10 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a  C_InAggFunc)==0.
2dd20 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65         && pWalke
2dd30 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d  r->walkerDepth==
2dd40 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20  pExpr->op2.     
2dd50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
2dd60 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
2dd70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
2dd80 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
2dd90 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
2dda0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
2ddb0 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
2ddc0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
2ddd0 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
2dde0 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
2ddf0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2de00 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
2de10 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
2de20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2de30 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2de40 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2de50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2de60 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2de70 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
2de80 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
2de90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2dea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2deb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dec0 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
2ded0 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
2dee0 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
2def0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
2df00 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2df10 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
2df20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2df30 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
2df40 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
2df50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
2df60 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
2df70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
2df80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2df90 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
2dfa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dfb0 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69  pExpr->eX==EX_Li
2dfc0 73 74 20 7c 7c 20 70 45 78 70 72 2d 3e 65 58 3d  st || pExpr->eX=
2dfd0 3d 45 58 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =EX_None );.    
2dfe0 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
2dff0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
2e000 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
2e010 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
2e020 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
2e030 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
2e040 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e050 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2e060 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2e070 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
2e080 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
2e090 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2e0a0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
2e0b0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
2e0c0 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
2e0d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2e0e0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20  ->u.zToken, .   
2e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e100 70 45 78 70 72 2d 3e 65 58 3d 3d 45 58 5f 4c 69  pExpr->eX==EX_Li
2e110 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
2e120 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
2e130 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
2e140 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2e150 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
2e160 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
2e170 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
2e180 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
2e190 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2e1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e1b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
2e1c0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e1e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e1f0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
2e200 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
2e210 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
2e220 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
2e230 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
2e240 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
2e250 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2e260 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2e270 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2e280 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
2e290 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2e2a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2e2b0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
2e2c0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
2e2d0 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
2e2e0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
2e2f0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
2e300 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2e310 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
2e320 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
2e330 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2e340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e350 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2e360 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
2e370 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
2e380 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
2e390 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2e3a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2e3b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2e3c0 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
2e3d0 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65    pWalker->walke
2e3e0 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72 65 74 75  rDepth++;.  retu
2e3f0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2e400 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
2e410 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2e420 49 6e 53 65 6c 65 63 74 45 6e 64 28 57 61 6c 6b  InSelectEnd(Walk
2e430 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2e440 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2e450 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e460 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 57  R(pSelect);.  pW
2e470 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
2e480 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  th--;.}../*.** A
2e490 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
2e4a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
2e4b0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2e4c0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
2e4d0 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
2e4e0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
2e4f0 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
2e500 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
2e510 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
2e520 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
2e530 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
2e540 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
2e550 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
2e560 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
2e570 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e580 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2e590 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
2e5a0 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
2e5b0 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
2e5c0 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
2e5d0 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
2e5e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2e5f0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2e600 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
2e610 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
2e620 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
2e630 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2e640 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
2e650 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
2e660 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
2e670 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
2e680 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53 65 6c 65  elect;.  w.xSele
2e690 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 61 6e  ctCallback2 = an
2e6a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49  alyzeAggregatesI
2e6b0 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20 20 77 2e  nSelectEnd;.  w.
2e6c0 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b  walkerDepth = 0;
2e6d0 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
2e6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
2e6f0 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
2e700 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
2e710 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
2e720 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
2e730 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2e740 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
2e750 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
2e760 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
2e770 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
2e780 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2e790 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
2e7a0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
2e7b0 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
2e7c0 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
2e7d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2e7e0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2e7f0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
2e800 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
2e810 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
2e820 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2e830 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
2e840 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2e850 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
2e860 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
2e870 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
2e880 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
2e890 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2e8a0 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
2e8b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2e8c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2e8d0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
2e8e0 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
2e8f0 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
2e900 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
2e910 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
2e920 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
2e930 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
2e940 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
2e950 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
2e960 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
2e970 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
2e980 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
2e990 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
2e9a0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
2e9b0 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
2e9c0 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
2e9d0 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
2e9e0 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
2e9f0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
2ea00 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ose..*/.void sql
2ea10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2ea20 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
2ea30 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
2ea40 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
2ea50 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
2ea60 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
2ea70 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 70  empReg) ){.    p
2ea80 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
2ea90 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
2eaa0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
2eab0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2eac0 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
2ead0 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
2eae0 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
2eaf0 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sters..*/.int sq
2eb00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2eb10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2eb20 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
2eb30 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 6e 52  t i, n;.  if( nR
2eb40 65 67 3d 3d 31 20 29 20 72 65 74 75 72 6e 20 73  eg==1 ) return s
2eb50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2eb60 28 70 50 61 72 73 65 29 3b 0a 20 20 69 20 3d 20  (pParse);.  i = 
2eb70 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
2eb80 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
2eb90 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
2eba0 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
2ebb0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
2ebc0 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
2ebd0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
2ebe0 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
2ebf0 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
2ec00 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2ec10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2ec20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
2ec30 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
2ec40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2ec50 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
2ec60 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
2ec70 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20 6e  t nReg){.  if( n
2ec80 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  Reg==1 ){.    sq
2ec90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2eca0 52 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 67  Reg(pParse, iReg
2ecb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2ecc0 20 7d 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50   }.  if( nReg>pP
2ecd0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
2ece0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
2ecf0 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
2ed00 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
2ed10 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
2ed20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
2ed30 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
2ed40 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
2ed50 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
2ed60 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
2ed70 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2ed80 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
2ed90 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
2eda0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
2edb0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
2edc0 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  geReg = 0;.}../*
2edd0 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61  .** Validate tha
2ede0 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72  t no temporary r
2edf0 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69  egister falls wi
2ee00 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  thin the range o
2ee10 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61  f.** iFirst..iLa
2ee20 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20  st, inclusive.  
2ee30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2ee40 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77  only call from w
2ee50 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a  ithin assert().*
2ee60 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  * statements..*/
2ee70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2ee80 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
2ee90 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50  NoTempsInRange(P
2eea0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2eeb0 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c  t iFirst, int iL
2eec0 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ast){.  int i;. 
2eed0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61   if( pParse->nRa
2eee0 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70  ngeReg>0.   && p
2eef0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
2ef00 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  +pParse->nRangeR
2ef10 65 67 20 3e 20 69 46 69 72 73 74 0a 20 20 20 26  eg > iFirst.   &
2ef20 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  & pParse->iRange
2ef30 52 65 67 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29  Reg <= iLast.  )
2ef40 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
2ef50 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2ef60 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  i<pParse->nTempR
2ef70 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  eg; i++){.    if
2ef80 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  ( pParse->aTempR
2ef90 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26 26  eg[i]>=iFirst &&
2efa0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
2efb0 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  g[i]<=iLast ){. 
2efc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2efd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2efe0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2eff0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2f000 0a                                               .