/ Hex Artifact Content
Login

Artifact f4bb756c02bb5cd1b020f3c9f760961506c18f3c:


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 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
0470: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0480: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
0490: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04a0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
04c0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
04e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
04f0: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0510: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0520: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 61 73 73  _CAST ){.    ass
0530: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
0540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0550: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
0560: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
0570: 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
0580: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0590: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
05a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
05b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  N || op==TK_COLU
05c0: 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47  MN || op==TK_REG
05d0: 49 53 54 45 52 29 20 0a 20 20 20 26 26 20 70 45  ISTER) .   && pE
05e0: 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29  xpr->pTab!=0.  )
05f0: 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f  {.    /* op==TK_
0600: 52 45 47 49 53 54 45 52 20 26 26 20 70 45 78 70  REGISTER && pExp
0610: 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  r->pTab!=0 happe
0620: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
0630: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
0640: 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20   ** a TK_COLUMN 
0650: 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  but was previous
0660: 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ly evaluated and
0670: 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67   cached in a reg
0680: 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ister */.    int
0690: 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   j = pExpr->iCol
06a0: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30  umn;.    if( j<0
06b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
06c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
06d0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
06e0: 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72  >pTab && j<pExpr
06f0: 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  ->pTab->nCol );.
0700: 20 20 20 20 72 65 74 75 72 6e 20 70 45 78 70 72      return pExpr
0710: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0720: 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20  affinity;.  }.  
0730: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66  return pExpr->af
0740: 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  finity;.}../*.**
0750: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
0760: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
0770: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0780: 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61   to be the colla
0790: 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
07a0: 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e   named by pToken
07b0: 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .   Return a poi
07c0: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78  nter to a new Ex
07d0: 70 72 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20  pr node that.** 
07e0: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43  implements the C
07f0: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
0800: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0810: 33 45 78 70 72 53 65 74 43 6f 6c 6c 42 79 54 6f  3ExprSetCollByTo
0820: 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ken(Parse *pPars
0830: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
0840: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65  Token *pCollName
0850: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20  ){.  Expr *pNew 
0860: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
0870: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
0880: 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43 6f 6c 6c  K_COLLATE, pColl
0890: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
08a0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
08b0: 2d 3e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b  ->pLeft = pExpr;
08c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
08d0: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a   |= EP_Collate;.
08e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
08f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  w;.}../*.** Retu
0900: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
0910: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0920: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0930: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0940: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
0950: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0960: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
0970: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
0980: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68  ng sequence migh
0990: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
09a0: 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
09b0: 72 61 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74  rator.** or by t
09c0: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
09d0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64   column with a d
09e0: 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  efined collating
09f0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f   sequence..** CO
0a00: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20  LLATE operators 
0a10: 74 61 6b 65 20 66 69 72 73 74 20 70 72 65 63 65  take first prece
0a20: 64 65 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65  dence.  Left ope
0a30: 72 61 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72  rands take.** pr
0a40: 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69  ecedence over ri
0a50: 67 68 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f  ght operands..*/
0a60: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0a70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0a90: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
0aa0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ab0: 2d 3e 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ->db;.  CollSeq 
0ac0: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78  *pColl = 0;.  Ex
0ad0: 70 72 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20  pr *p = pExpr;. 
0ae0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 43 6f   while( p && pCo
0af0: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ll==0 ){.    int
0b00: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20   op = p->op;.   
0b10: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
0b20: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
0b30: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 2d   ){.      p = p-
0b40: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63 6f  >pLeft;.      co
0b50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
0b60: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4c    if( op==TK_COL
0b70: 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 70 43  LATE ){.      pC
0b80: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
0b90: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
0ba0: 28 64 62 29 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  (db), p->u.zToke
0bb0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
0bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
0bd0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  ( p->pTab!=0.   
0be0: 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47    && (op==TK_AGG
0bf0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
0c00: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
0c10: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
0c20: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
0c30: 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a  TRIGGER).    ){.
0c40: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
0c50: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
0c60: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
0c70: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
0c80: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
0c90: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
0ca0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
0cb0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
0cc0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
0cd0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
0ce0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
0cf0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
0d00: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
0d10: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
0d20: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
0d30: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
0d40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
0d50: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
0d60: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
0d70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
0d80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0d90: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
0da0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
0db0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
0dc0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
0dd0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
0de0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
0df0: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
0e00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0e10: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
0e20: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
0e30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
0e40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
0e50: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
0e60: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
0e70: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
0e80: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
0e90: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
0ea0: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0eb0: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
0ec0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
0ed0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
0ee0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
0ef0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
0f00: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
0f10: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
0f20: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
0f30: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
0f40: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
0f50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
0f60: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
0f70: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
0f80: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
0f90: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
0fa0: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
0fb0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0fc0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
0fd0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
0fe0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
0ff0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1000: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
1010: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1020: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1030: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1040: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1050: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1060: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1070: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1080: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1090: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
10a0: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
10b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
10c0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
10d0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
10e0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  n SQLITE_AFF_NON
10f0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
1100: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
1110: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1120: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1130: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1140: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1150: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1160: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1170: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1180: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  n SQLITE_AFF_NON
1190: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
11a0: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
11b0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
11c0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
11d0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
11e0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
11f0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
1200: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
1210: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1220: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1230: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1240: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1250: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1260: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1270: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1280: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1290: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
12a0: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
12b0: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
12c0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
12d0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
12e0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
12f0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1300: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1310: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1320: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1330: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1340: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1350: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1360: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1370: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1380: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1390: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
13a0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
13b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
13c0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
13d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
13e0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
13f0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1400: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1410: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1420: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1430: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1440: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1450: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1460: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1470: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1480: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1490: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
14a0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
14b0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
14c0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
14d0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
14e0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
14f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1500: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65  F_NONE;.  }.  re
1510: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1520: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1530: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1540: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1550: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1560: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1570: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1580: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1590: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
15a0: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
15b0: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
15c0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
15d0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
15e0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
15f0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1600: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1610: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1620: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1630: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1640: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1650: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1660: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1670: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1680: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
1690: 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  NE:.      return
16a0: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
16b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
16c0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
16d0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
16e0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
16f0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1700: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1710: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1720: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1730: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1740: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1750: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1760: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1770: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1780: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1790: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
17a0: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
17b0: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
17c0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
17d0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
17e0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
17f0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1800: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1810: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
1820: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
1830: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
1840: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1850: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
1860: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
1870: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
1880: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1890: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
18a0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
18b0: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
18c0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
18d0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
18e0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
18f0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
1900: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
1910: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
1920: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
1930: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1940: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
1950: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
1960: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
1970: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
1980: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
1990: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
19a0: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
19b0: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
19c0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
19d0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
19e0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
19f0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
1a00: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
1a10: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
1a20: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
1a30: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
1a40: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
1a50: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
1a60: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
1a70: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
1a80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
1a90: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
1aa0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
1ab0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1ac0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
1ad0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
1ae0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1af0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
1b00: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1b10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b20: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
1b30: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
1b40: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1b50: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
1b60: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1b70: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b80: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
1b90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
1ba0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1bb0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1bc0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
1bd0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1be0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1bf0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1c00: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
1c10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c20: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
1c30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1c40: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
1c50: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
1c60: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
1c70: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
1c80: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
1c90: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
1ca0: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
1cb0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1cc0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1cd0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1ce0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
1cf0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
1d00: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
1d10: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
1d20: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
1d30: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
1d40: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
1d50: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
1d60: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
1d70: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
1d80: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1d90: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
1da0: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
1db0: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
1dc0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
1dd0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
1de0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
1df0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
1e00: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
1e10: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
1e20: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1e30: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
1e40: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
1e50: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
1e60: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
1e70: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
1e80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1e90: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
1ea0: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
1eb0: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
1ee0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1f00: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
1f10: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
1f20: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
1f30: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
1f40: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
1f50: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
1f60: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
1f70: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1f80: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
1f90: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
1fa0: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
1fb0: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
1fc0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1fd0: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
1fe0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ff0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
2000: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2010: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
2020: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2030: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
2040: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
2050: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2060: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
2070: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
2080: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
2090: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20a0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
20b0: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
20c0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
20d0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
20e0: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
20f0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2100: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
2110: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2120: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
2130: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
2140: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
2150: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2160: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
2170: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
2180: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2190: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
21a0: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
21b0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
21c0: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
21d0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
21e0: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
21f0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2200: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
2210: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2220: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
2230: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
2240: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
2250: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
2260: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
2270: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
2280: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
2290: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
22a0: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
22b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
22c0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
22d0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
22e0: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
22f0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
2300: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
2310: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2320: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2330: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
2340: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2350: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2360: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2370: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2380: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
2390: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
23a0: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
23b0: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
23c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
23d0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
23e0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
23f0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2400: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
2410: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
2420: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2430: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
2440: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
2450: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2460: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
2470: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2480: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
2490: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
24a0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
24b0: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
24c0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
24d0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
24e0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
24f0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2500: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2510: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
2520: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2530: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
2540: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
2550: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
2560: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
2570: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
2580: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2590: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
25a0: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
25b0: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
25c0: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
25d0: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
25e0: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
25f0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
2600: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
2610: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
2620: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
2630: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2640: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
2650: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
2660: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74   plus one..*/.st
2670: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65  atic void exprSe
2680: 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29  tHeight(Expr *p)
2690: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
26a0: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  = 0;.  heightOfE
26b0: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e  xpr(p->pLeft, &n
26c0: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
26d0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68  tOfExpr(p->pRigh
26e0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
26f0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2700: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
2710: 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67  ect) ){.    heig
2720: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e  htOfSelect(p->x.
2730: 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68  pSelect, &nHeigh
2740: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
2750: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2760: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
2770: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  Height);.  }.  p
2780: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
2790: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
27a0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
27b0: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
27c0: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
27d0: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
27e0: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
27f0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
2800: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
2810: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
2820: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
2830: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
2840: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
2850: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2860: 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72  ight(Parse *pPar
2870: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
2880: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 29  exprSetHeight(p)
2890: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
28a0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
28b0: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
28c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28d0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
28e0: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
28f0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
2900: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
2910: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2920: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
2930: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
2940: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2950: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
2960: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
2970: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
2980: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
2990: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
29a0: 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20  ight;.}.#else.  
29b0: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
29c0: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
29d0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
29e0: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
29f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a00: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
2a10: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
2a20: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
2a30: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
2a40: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
2a50: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
2a60: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
2a70: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
2a80: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
2a90: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
2aa0: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
2ab0: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
2ac0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
2ad0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
2ae0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
2af0: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
2b00: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
2b10: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
2b20: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
2b30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
2b40: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
2b50: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
2b60: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
2b70: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
2b80: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
2b90: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
2ba0: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65  erformance.  The
2bb0: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
2bc0: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
2bd0: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
2be0: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
2bf0: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
2c00: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
2c10: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
2c20: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
2c30: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
2c40: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
2c50: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
2c60: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
2c70: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2c80: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
2c90: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
2ca0: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
2cb0: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
2cc0: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
2cd0: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
2ce0: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
2cf0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
2d00: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
2d10: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
2d20: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
2d30: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
2d40: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
2d50: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
2d60: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
2d70: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
2d80: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
2d90: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
2da0: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2db0: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
2dc0: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
2dd0: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
2de0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2df0: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
2e00: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
2e10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2e20: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
2e30: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
2e40: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
2e50: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2e60: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2e70: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
2e80: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
2e90: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
2ea0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
2eb0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
2ec0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
2ed0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2ee0: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
2ef0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
2f00: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
2f10: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
2f20: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
2f30: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
2f40: 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65  INTEGER || pToke
2f50: 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  n->z==0.        
2f60: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
2f70: 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  nt32(pToken->z, 
2f80: 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20  &iValue)==0 ){. 
2f90: 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54       nExtra = pT
2fa0: 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20  oken->n+1;.     
2fb0: 20 61 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e   assert( iValue>
2fc0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
2fd0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2fe0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
2ff0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45   sizeof(Expr)+nE
3000: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65  xtra);.  if( pNe
3010: 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  w ){.    pNew->o
3020: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
3030: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
3040: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
3050: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
3060: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
3070: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3080: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
3090: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
30a0: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
30b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30c0: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
30d0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
30e0: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
30f0: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
3100: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
3110: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
3120: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
3130: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
3140: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
3150: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
3160: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
3170: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3180: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
3190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
31a0: 71 75 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e  quote && nExtra>
31b0: 3d 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =3 .            
31c0: 20 26 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e   && ((c = pToken
31d0: 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c  ->z[0])=='\'' ||
31e0: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b   c=='"' || c=='[
31f0: 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a  ' || c=='`') ){.
3200: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3210: 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Dequote(pNew->u
3220: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
3230: 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29      if( c=='"' )
3240: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
3250: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
3260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3270: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
3280: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
3290: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
32a0: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
32b0: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
32c0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
32d0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
32e0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
32f0: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
3300: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
3310: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
3320: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
3330: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3340: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3360: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3370: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3380: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3390: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
33b0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
33c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
33d0: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
33e0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
33f0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
3400: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
3410: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
3420: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
3430: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
3440: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
3450: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
3460: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
3470: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
3480: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
3490: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
34a0: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
34b0: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
34c0: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
34d0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
34e0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
34f0: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
3500: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
3510: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
3520: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
3530: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
3540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
3550: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3560: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3570: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
3580: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
3590: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
35a0: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
35b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
35c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
35d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
35e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
35f0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
3600: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3610: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
3620: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
3630: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3640: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
3650: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
3660: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
3670: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
3680: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
3690: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
36a0: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
36b0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
36c0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  t->flags |= EP_C
36d0: 6f 6c 6c 61 74 65 20 26 20 70 4c 65 66 74 2d 3e  ollate & pLeft->
36e0: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
36f0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
3700: 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Root);.  }.}../*
3710: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 45  .** Allocate a E
3720: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
3730: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
3740: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
3750: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
3760: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
3770: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
3780: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3790: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
37a0: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
37b0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
37c0: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
37d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
37e0: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
37f0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
3800: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
3810: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
3820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3840: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3850: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3870: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3880: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
3890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
38a0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
38b0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
38c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
38d0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  t operand */.  c
38e0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
38f0: 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  en     /* Argume
3900: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  nt token */.){. 
3910: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
3920: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 4c  op==TK_AND && pL
3930: 65 66 74 20 26 26 20 70 52 69 67 68 74 20 29 7b  eft && pRight ){
3940: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76  .    /* Take adv
3950: 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d  antage of short-
3960: 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70  circuit false op
3970: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41  timization for A
3980: 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71  ND */.    p = sq
3990: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
39a0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20  rse->db, pLeft, 
39b0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
39c0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
39d0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
39e0: 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65  e->db, op, pToke
39f0: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
3a00: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3a10: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3a20: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3a30: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
3a40: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
3a50: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
3a60: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
3a70: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
3a80: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
3a90: 75 72 6e 20 31 20 69 66 20 61 6e 20 65 78 70 72  urn 1 if an expr
3aa0: 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 46  ession must be F
3ab0: 41 4c 53 45 20 69 6e 20 61 6c 6c 20 63 61 73 65  ALSE in all case
3ac0: 73 20 61 6e 64 20 30 20 69 66 20 74 68 65 0a 2a  s and 0 if the.*
3ad0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  * expression mig
3ae0: 68 74 20 62 65 20 74 72 75 65 2e 20 20 54 68 69  ht be true.  Thi
3af0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
3b00: 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b 20  tion.  If is OK 
3b10: 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 30 20 68  to.** return 0 h
3b20: 65 72 65 20 65 76 65 6e 20 69 66 20 74 68 65 20  ere even if the 
3b30: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c 6c  expression reall
3b40: 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73  y is always fals
3b50: 65 20 28 61 20 0a 2a 2a 20 66 61 6c 73 65 20 6e  e (a .** false n
3b60: 65 67 61 74 69 76 65 29 2e 20 20 42 75 74 20 69  egative).  But i
3b70: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
3b80: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
3b90: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d 69 67 68  pression.** migh
3ba0: 74 20 62 65 20 74 72 75 65 20 69 6e 20 73 6f 6d  t be true in som
3bb0: 65 20 72 61 72 65 20 63 69 72 63 75 6d 73 74 61  e rare circumsta
3bc0: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
3bd0: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
3be0: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
3bf0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
3c00: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
3c10: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
3c20: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
3c30: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
3c40: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
3c50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
3c60: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
3c70: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
3c80: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
3c90: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
3ca0: 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70 29  ysFalse(Expr *p)
3cb0: 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  {.  int v = 0;. 
3cc0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
3cd0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
3ce0: 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
3cf0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
3d00: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20  xprIsInteger(p, 
3d10: 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  &v) ) return 0;.
3d20: 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a 7d    return v==0;.}
3d30: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
3d40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
3d50: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
3d60: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
3d70: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
3d80: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
3d90: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
3da0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
3db0: 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f  ** If one side o
3dc0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
3dd0: 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20  he AND is known 
3de0: 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65  to be false, the
3df0: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
3e00: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44  returning an AND
3e10: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73   expression, jus
3e20: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74  t return a const
3e30: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ant expression w
3e40: 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f  ith.** a value o
3e50: 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72  f false..*/.Expr
3e60: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
3e70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3e80: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
3e90: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
3ea0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
3eb0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
3ec0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
3ed0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
3ee0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
3ef0: 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
3f00: 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20  False(pLeft) || 
3f10: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
3f20: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73  pRight) ){.    s
3f30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3f40: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
3f50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3f60: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3f70: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
3f80: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3f90: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
3fa0: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
3fb0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
3fc0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
3fd0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3fe0: 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  (db, TK_AND, 0, 
3ff0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
4000: 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65  xprAttachSubtree
4010: 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65 66  s(db, pNew, pLef
4020: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
4030: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20 7d  return pNew;.  }
4040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
4050: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
4060: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
4070: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
4080: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
4090: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
40a0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
40b0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
40c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
40d0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
40e0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
40f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4100: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
4110: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
4120: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
4130: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
4140: 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b 65  _FUNCTION, pToke
4150: 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65  n, 1);.  if( pNe
4160: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
4170: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4180: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f 2a  e(db, pList); /*
4190: 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c 65   Avoid memory le
41a0: 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ak when malloc f
41b0: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
41c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
41d0: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
41e0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  t;.  assert( !Ex
41f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
4200: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
4210: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ) );.  sqlite3Ex
4220: 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61 72  prSetHeight(pPar
4230: 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74  se, pNew);.  ret
4240: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
4250: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
4260: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
4270: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
4280: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
4290: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
42a0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
42b0: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
42c0: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
42d0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
42e0: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
42f0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
4300: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
4310: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
4320: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
4330: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
4340: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
4350: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
4360: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
4370: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20  " is not too be 
4380: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
4390: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
43a0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
43b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
43c0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
43d0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
43e0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
43f0: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
4400: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
4410: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
4420: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
4430: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
4440: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
4450: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
4460: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
4470: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
4480: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
4490: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
44a0: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
44b0: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
44c0: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
44d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
44e0: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
44f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4500: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c  r *pExpr){.  sql
4510: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4520: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
4530: 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70  har *z;..  if( p
4540: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
4550: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
4560: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
4570: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
4580: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
4590: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
45a0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
45b0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
45c0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
45d0: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69  ( z[0]!=0 );.  i
45e0: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  f( z[1]==0 ){.  
45f0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
4600: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
4610: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
4620: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4630: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  */.    assert( z
4640: 5b 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20  [0]=='?' );.    
4650: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4660: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
4670: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73  e->nVar);.  }els
4680: 65 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d  e{.    ynVar x =
4690: 20 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20   0;.    u32 n = 
46a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
46b0: 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  z);.    if( z[0]
46c0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f  =='?' ){.      /
46d0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
46e0: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20  e form "?nnn".  
46f0: 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f  Convert "nnn" to
4700: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a   an integer and.
4710: 20 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20        ** use it 
4720: 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  as the variable 
4730: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
4740: 69 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  i64 i;.      int
4750: 20 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65   bOk = 0==sqlite
4760: 33 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26  3Atoi64(&z[1], &
4770: 69 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55  i, n-1, SQLITE_U
4780: 54 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70  TF8);.      pExp
4790: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d  r->iColumn = x =
47a0: 20 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20   (ynVar)i;.     
47b0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
47c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
47d0: 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20  e( i==1 );.     
47e0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
47f0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4800: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4810: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
4820: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
4830: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4840: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4850: 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20  NUMBER] );.     
4860: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69   if( bOk==0 || i
4870: 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d  <1 || i>db->aLim
4880: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4890: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
48a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
48b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
48c0: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
48d0: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
48e0: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
48f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  ,.            db
4900: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4910: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4920: 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20  UMBER]);.       
4930: 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a   x = 0;.      }.
4940: 20 20 20 20 20 20 69 66 28 20 69 3e 70 50 61 72        if( i>pPar
4950: 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  se->nVar ){.    
4960: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
4970: 20 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20   = (int)i;.     
4980: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
4990: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
49a0: 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24   like ":aaa", "$
49b0: 61 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20  aaa" or "@aaa". 
49c0: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
49d0: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
49e0: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
49f0: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
4a00: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
4a10: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
4a20: 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  e.      ** has n
4a30: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
4a40: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
4a50: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
4a60: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mber.      */.  
4a70: 20 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20      ynVar i;.   
4a80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
4a90: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b  arse->nzVar; i++
4aa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4ab0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20  Parse->azVar[i] 
4ac0: 26 26 20 6d 65 6d 63 6d 70 28 70 50 61 72 73 65  && memcmp(pParse
4ad0: 2d 3e 61 7a 56 61 72 5b 69 5d 2c 7a 2c 6e 2b 31  ->azVar[i],z,n+1
4ae0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4af0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4b00: 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 2b   = x = (ynVar)i+
4b10: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
4b20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4b40: 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70 72  x==0 ) x = pExpr
4b50: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
4b60: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
4b70: 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ar);.    }.    i
4b80: 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( x>0 ){.      
4b90: 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e 7a  if( x>pParse->nz
4ba0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Var ){.        c
4bb0: 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20 20  har **a;.       
4bc0: 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65   a = sqlite3DbRe
4bd0: 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73 65  alloc(db, pParse
4be0: 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65 6f  ->azVar, x*sizeo
4bf0: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
4c00: 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65 74    if( a==0 ) ret
4c10: 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20 72  urn;  /* Error r
4c20: 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68 20  eported through 
4c30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4c40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61 72   */.        pPar
4c50: 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20  se->azVar = a;. 
4c60: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
4c70: 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c  [pParse->nzVar],
4c80: 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e   0, (x-pParse->n
4c90: 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30  zVar)*sizeof(a[0
4ca0: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ]));.        pPa
4cb0: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a  rse->nzVar = x;.
4cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4cd0: 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70  ( z[0]!='?' || p
4ce0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
4cf0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
4d00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4d10: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
4d20: 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  x-1]);.        p
4d30: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
4d40: 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  ] = sqlite3DbStr
4d50: 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a  NDup(db, z, n);.
4d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4d70: 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  } .  if( !pParse
4d80: 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65  ->nErr && pParse
4d90: 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69  ->nVar>db->aLimi
4da0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4db0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4dc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4dd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4de0: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
4df0: 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a  iables");.  }.}.
4e00: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
4e10: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
4e20: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
4e30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4e40: 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  rDelete(sqlite3 
4e50: 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  *db, Expr *p){. 
4e60: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4e70: 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  rn;.  /* Sanity 
4e80: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
4e90: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
4ea0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
4eb0: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
4ec0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
4ed0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4ee0: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
4ef0: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
4f00: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e    if( !ExprHasAn
4f10: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
4f20: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
4f30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4f40: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
4f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4f60: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
4f70: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
4f80: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
4f90: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
4fa0: 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20 26   && (p->flags2 &
4fb0: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
4fc0: 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
4fd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fe0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
4ff0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78      }.    if( Ex
5000: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5010: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
5020: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
5030: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
5040: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
5050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5060: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5070: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
5080: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
5090: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
50a0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
50b0: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
50c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
50d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
50e0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
50f0: 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63  r of bytes alloc
5100: 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70  ated for the exp
5110: 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72  ression structur
5120: 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  e .** passed as 
5130: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5140: 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  nt. This is alwa
5150: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
5160: 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52  ULLSIZE,.** EXPR
5170: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20  _REDUCEDSIZE or 
5180: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5190: 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ZE..*/.static in
51a0: 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  t exprStructSize
51b0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
51c0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
51d0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
51e0: 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ) ) return EXPR_
51f0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20  TOKENONLYSIZE;. 
5200: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5210: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
5220: 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ed) ) return EXP
5230: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20  R_REDUCEDSIZE;. 
5240: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c   return EXPR_FUL
5250: 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSIZE;.}../*.** 
5260: 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69  The dupedExpr*Si
5270: 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61  ze() routines ea
5280: 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  ch return the nu
5290: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
52a0: 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f  quired.** to sto
52b0: 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  re a copy of an 
52c0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78  expression or ex
52d0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
52e0: 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a  They differ in.*
52f0: 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  * how much of th
5300: 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72  e tree is measur
5310: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75  ed..**.**     du
5320: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
5330: 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20  e()     Size of 
5340: 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74  only the Expr st
5350: 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20  ructure .**     
5360: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5370: 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f  e()       Size o
5380: 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66  f Expr + space f
5390: 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20  or token.**     
53a0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20  dupedExprSize() 
53b0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b            Expr +
53c0: 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65   token + subtree
53d0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a   components.**.*
53e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
5430: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74   The dupedExprSt
5440: 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74  ructSize() funct
5450: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20  ion returns two 
5460: 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67  values OR-ed tog
5470: 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20  ether:  .** (1) 
5480: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
5490: 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66  ed for a copy of
54a0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
54b0: 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a  ure only and .**
54c0: 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20   (2) the EP_xxx 
54d0: 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63  flags that indic
54e0: 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72  ate what the str
54f0: 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75  ucture size shou
5500: 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65  ld be..** The re
5510: 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61  turn values is a
5520: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  lways one of:.**
5530: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55  .**      EXPR_FU
5540: 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45  LLSIZE.**      E
5550: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5560: 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a    | EP_Reduced.*
5570: 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45  *      EXPR_TOKE
5580: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5590: 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54  okenOnly.**.** T
55a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  he size of the s
55b0: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
55c0: 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67  found by masking
55d0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
55e0: 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75  e.** of this rou
55f0: 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e  tine with 0xfff.
5600: 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20    The flags can 
5610: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5620: 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  ing the.** retur
5630: 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f  n value with EP_
5640: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
5650: 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  Only..**.** Note
5660: 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73   that with flags
5670: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
5680: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20  , this routines 
5690: 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69  works on full-si
56a0: 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64  ze.** (unreduced
56b0: 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61  ) Expr objects a
56c0: 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e  s they or origin
56d0: 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64  ally constructed
56e0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a   by the parser..
56f0: 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73  ** During expres
5700: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65  sion analysis, e
5710: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5720: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64   is computed and
5730: 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c   moved into.** l
5740: 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65  ater parts of te
5750: 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e  h Expr object an
5760: 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66  d that extra inf
5770: 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67  ormation might g
5780: 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66  et chopped.** of
5790: 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  f if the express
57a0: 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20  ion is reduced. 
57b0: 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20   Note also that 
57c0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  it does not work
57d0: 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45 58   to.** make a EX
57e0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
57f0: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
5800: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
5810: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
5820: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
5830: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
5840: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
5850: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
5860: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
5870: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5880: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
5890: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
58a0: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
58b0: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
58c0: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
58d0: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
58e0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
58f0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5900: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
5910: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
5920: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
5930: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
5940: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
5950: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
5960: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69 66   allowed */.  if
5970: 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52  ( 0==(flags&EXPR
5980: 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20  DUP_REDUCE) ){. 
5990: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
59a0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
59b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
59c0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
59d0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
59e0: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
59f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5a00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5a10: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
5a20: 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ; .    assert( (
5a30: 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f  p->flags2 & EP2_
5a40: 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d  MallocedToken)==
5a50: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5a60: 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50   (p->flags2 & EP
5a70: 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d 3d  2_Irreducible)==
5a80: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
5a90: 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69 67  pLeft || p->pRig
5aa0: 68 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ht || p->x.pList
5ab0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
5ac0: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
5ad0: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
5ae0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5af0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54    nSize = EXPR_T
5b00: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
5b10: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
5b20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5b30: 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nSize;.}../*.** 
5b40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
5b50: 74 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20  turns the space 
5b60: 69 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65  in bytes require
5b70: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  d to store the c
5b80: 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45  opy .** of the E
5b90: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  xpr structure an
5ba0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
5bb0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74  Expr.u.zToken st
5bc0: 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a  ring (if that.**
5bd0: 20 73 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e   string is defin
5be0: 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed.).*/.static i
5bf0: 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  nt dupedExprNode
5c00: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
5c10: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
5c20: 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70  nByte = dupedExp
5c30: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
5c40: 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20  lags) & 0xfff;. 
5c50: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
5c60: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
5c70: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
5c80: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74  oken ){.    nByt
5c90: 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
5ca0: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
5cb0: 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )+1;.  }.  retur
5cc0: 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  n ROUND8(nByte);
5cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5ce0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5cf0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
5d00: 20 63 72 65 61 74 65 20 61 20 64 75 70 6c 69 63   create a duplic
5d10: 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65  ate of the .** e
5d20: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
5d30: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
5d40: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f  gument. The seco
5d50: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
5d60: 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  .** mask contain
5d70: 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58 58 20  ing EXPRDUP_XXX 
5d80: 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
5d90: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5da0: 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65 20 74  includes space t
5db0: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
5dc0: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
5dd0: 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64  ct.** itself and
5de0: 20 74 68 65 20 62 75 66 66 65 72 20 72 65 66 65   the buffer refe
5df0: 72 72 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e  rred to by Expr.
5e00: 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  u.zToken, if any
5e10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
5e20: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c  XPRDUP_REDUCE fl
5e30: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
5e40: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
5e50: 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70   includes .** sp
5e60: 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65  ace to duplicate
5e70: 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20   all Expr nodes 
5e80: 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d  in the tree form
5e90: 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74  ed by Expr.pLeft
5ea0: 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52   .** and Expr.pR
5eb0: 69 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28  ight variables (
5ec0: 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20  but not for any 
5ed0: 73 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74  structures point
5ee0: 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73  ed to or .** des
5ef0: 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20  cended from the 
5f00: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20  Expr.x.pList or 
5f10: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76  Expr.x.pSelect v
5f20: 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74  ariables)..*/.st
5f30: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
5f40: 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  prSize(Expr *p, 
5f50: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
5f60: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69  t nByte = 0;.  i
5f70: 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74  f( p ){.    nByt
5f80: 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64  e = dupedExprNod
5f90: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
5fa0: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45  .    if( flags&E
5fb0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b  XPRDUP_REDUCE ){
5fc0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
5fd0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
5fe0: 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b  >pLeft, flags) +
5ff0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
6000: 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29  ->pRight, flags)
6010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6020: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
6030: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6040: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
6050: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6060: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
6070: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
6080: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
6090: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
60a0: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
60b0: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
60c0: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
60d0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
60e0: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
60f0: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75  e copies of p->u
6100: 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61  .zToken.** (if a
6110: 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20  pplicable), and 
6120: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
6130: 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  e p->pLeft and p
6140: 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65 73 73  ->pRight express
6150: 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  ions,.** if any.
6160: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
6170: 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  g, *pzBuffer is 
6180: 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  set to the first
6190: 20 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65   byte passed the
61a0: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
61b0: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
61c0: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
61d0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
61e0: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
61f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
6200: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c  r *p, int flags,
6210: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
6220: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
6230: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6240: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
6250: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
6260: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e  if( p ){.    con
6270: 73 74 20 69 6e 74 20 69 73 52 65 64 75 63 65 64  st int isReduced
6280: 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52 44 55   = (flags&EXPRDU
6290: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 75  P_REDUCE);.    u
62a0: 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75  8 *zAlloc;.    u
62b0: 33 32 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20  32 staticFlag = 
62c0: 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  0;..    assert( 
62d0: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69  pzBuffer==0 || i
62e0: 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20 20 20  sReduced );..   
62f0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
6300: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
6310: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
6320: 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ture. */.    if(
6330: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
6340: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42     zAlloc = *pzB
6350: 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73 74 61  uffer;.      sta
6360: 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61  ticFlag = EP_Sta
6370: 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  tic;.    }else{.
6380: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73        zAlloc = s
6390: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
63a0: 77 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53  w(db, dupedExprS
63b0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a  ize(p, flags));.
63c0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d      }.    pNew =
63d0: 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b   (Expr *)zAlloc;
63e0: 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ..    if( pNew )
63f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e  {.      /* Set n
6400: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
6410: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
6420: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
6430: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 20  pointed to.     
6440: 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69   ** by pNew. Thi
6450: 73 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52  s is either EXPR
6460: 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f  _FULLSIZE, EXPR_
6470: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20  REDUCEDSIZE or. 
6480: 20 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b       ** EXPR_TOK
6490: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
64a0: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
64b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
64c0: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20 20   consumed.      
64d0: 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f  ** by the copy o
64e0: 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65  f the p->u.zToke
64f0: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79  n string (if any
6500: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
6510: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
6520: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64   nStructSize = d
6530: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6540: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
6550: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e      const int nN
6560: 65 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74  ewSize = nStruct
6570: 53 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20  Size & 0xfff;.  
6580: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a      int nToken;.
6590: 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
65a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
65b0: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
65c0: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
65d0: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71       nToken = sq
65e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
65f0: 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a  >u.zToken) + 1;.
6600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6610: 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b       nToken = 0;
6620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6630: 66 28 20 69 73 52 65 64 75 63 65 64 20 29 7b 0a  f( isReduced ){.
6640: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6650: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6660: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d  p, EP_Reduced)==
6670: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 );.        mem
6680: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
6690: 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  NewSize);.      
66a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
66b0: 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78 70 72 53  nt nSize = exprS
66c0: 74 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20  tructSize(p);.  
66d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
66e0: 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a  loc, p, nSize);.
66f0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
6700: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
6710: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
6720: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nSize);.      }.
6730: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
6740: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
6750: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
6760: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
6770: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
6780: 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  /.      pNew->fl
6790: 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75  ags &= ~(EP_Redu
67a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
67b0: 7c 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  |EP_Static);.   
67c0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
67d0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
67e0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
67f0: 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  okenOnly);.     
6800: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6810: 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20  staticFlag;..   
6820: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
6830: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
6840: 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  g, if any. */.  
6850: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
6860: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
6870: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
6880: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
6890: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
68a0: 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  e];.        memc
68b0: 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e  py(zToken, p->u.
68c0: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  zToken, nToken);
68d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
68e0: 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67  if( 0==((p->flag
68f0: 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26  s|pNew->flags) &
6900: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
6910: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  {.        /* Fil
6920: 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78  l in the pNew->x
6930: 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77  .pSelect or pNew
6940: 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72  ->x.pList member
6950: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
6960: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
6970: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
6980: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
6990: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  New->x.pSelect =
69a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
69b0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  p(db, p->x.pSele
69c0: 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  ct, isReduced);.
69d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
69e0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78           pNew->x
69f0: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
6a00: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
6a10: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65  p->x.pList, isRe
6a20: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
6a30: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
6a40: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
6a50: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
6a60: 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ->pRight. */.   
6a70: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e     if( ExprHasAn
6a80: 79 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  yProperty(pNew, 
6a90: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6aa0: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
6ab0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
6ac0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6ad0: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6ae0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
6af0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
6b00: 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20  Reduced) ){.    
6b10: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
6b20: 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20  t = exprDup(db, 
6b30: 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55  p->pLeft, EXPRDU
6b40: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
6b50: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  c);.          pN
6b60: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70  ew->pRight = exp
6b70: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
6b80: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
6b90: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20  CE, &zAlloc);.  
6ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6bb0: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6bc0: 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66            *pzBuf
6bd0: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
6be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
6bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
6c00: 77 2d 3e 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20  w->flags2 = 0;. 
6c10: 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72         if( !Expr
6c20: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6c30: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
6c40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
6c50: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
6c60: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
6c70: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
6c80: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
6c90: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
6ca0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
6cb0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 0);.        }
6cc0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a  .      }..    }.
6cd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
6ce0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  w;.}../*.** The 
6cf0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
6d00: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
6d10: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
6d20: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
6d30: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
6d40: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
6d50: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
6d60: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
6d70: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
6d80: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
6d90: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
6da0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
6db0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
6dc0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
6dd0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
6de0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
6df0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
6e00: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
6e10: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
6e20: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
6e30: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
6e40: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
6e50: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
6e60: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
6e70: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
6e80: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
6e90: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
6ea0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
6eb0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
6ec0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
6ed0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
6ee0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
6ef0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
6f00: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
6f10: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
6f20: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
6f30: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
6f40: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
6f50: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
6f60: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
6f70: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
6f80: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
6f90: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
6fa0: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
6fb0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
6fc0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
6fd0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
6fe0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
6ff0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7000: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
7010: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
7020: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
7030: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
7040: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
7050: 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64 62  eturn exprDup(db
7060: 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  , p, flags, 0);.
7070: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
7080: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
7090: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
70a0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
70b0: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
70c0: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
70d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
70e0: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
70f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7100: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7110: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7120: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7130: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
7140: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7150: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7160: 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30  ew->iECursor = 0
7170: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
7180: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
7190: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
71a0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
71b0: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
71c0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
71d0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
71e0: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
71f0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73  llocRaw(db,  i*s
7200: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
7210: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
7220: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7230: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
7240: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7250: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
7260: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
7270: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
7280: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
7290: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
72a0: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
72b0: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
72c0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
72d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
72e0: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
72f0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
7300: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
7310: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7320: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
7330: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
7340: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7350: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
7360: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
7370: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
7380: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
7390: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
73a0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
73b0: 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
73c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 4f 72   = pOldItem->iOr
73d0: 64 65 72 42 79 43 6f 6c 3b 0a 20 20 20 20 70 49  derByCol;.    pI
73e0: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
73f0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
7400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7410: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
7420: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
7430: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
7440: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
7450: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
7460: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
7470: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7480: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
7490: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
74a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
74b0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
74c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
74d0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
74e0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
74f0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
7500: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
7510: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
7520: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
7530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7540: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
7550: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7560: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
7570: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
7580: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7590: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
75a0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
75b0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
75c0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
75d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
75e0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
75f0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
7600: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
7610: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
7620: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
7630: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7640: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7650: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
7660: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7670: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
7680: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7690: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
76a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
76b0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
76c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
76d0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
76e0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
76f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
7700: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
7710: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
7720: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
7730: 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
7740: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
7750: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
7760: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
7770: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7780: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
7790: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
77a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
77b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
77c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
77d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
77e0: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
77f0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
7800: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
7810: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e    pNewItem->join
7820: 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  type = pOldItem-
7830: 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70  >jointype;.    p
7840: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
7850: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
7860: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
7870: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
7880: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72  = pOldItem->addr
7890: 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65  FillSub;.    pNe
78a0: 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  wItem->regReturn
78b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67   = pOldItem->reg
78c0: 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4e 65 77  Return;.    pNew
78d0: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
78e0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ed = pOldItem->i
78f0: 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a 20 20 20  sCorrelated;.   
7900: 20 70 4e 65 77 49 74 65 6d 2d 3e 76 69 61 43 6f   pNewItem->viaCo
7910: 72 6f 75 74 69 6e 65 20 3d 20 70 4f 6c 64 49 74  routine = pOldIt
7920: 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
7930: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7940: 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
7950: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7960: 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  dItem->zIndex);.
7970: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f      pNewItem->no
7980: 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49  tIndexed = pOldI
7990: 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b  tem->notIndexed;
79a0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
79b0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
79c0: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54  ->pIndex;.    pT
79d0: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
79e0: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
79f0: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
7a00: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
7a10: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
7a20: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
7a30: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7a40: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c  electDup(db, pOl
7a50: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  dItem->pSelect, 
7a60: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
7a70: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
7a80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7a90: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c  OldItem->pOn, fl
7aa0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
7ab0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
7ac0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
7ad0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
7ae0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
7af0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
7b00: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
7b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7b20: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
7b30: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
7b40: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
7b50: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
7b60: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
7b70: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7b80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
7b90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7ba0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7bb0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
7bc0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7bd0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
7be0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
7bf0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
7c00: 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49  locRaw(db, p->nI
7c10: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
7c20: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
7c30: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
7c40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7c50: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7c60: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
7c70: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
7c80: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
7c90: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
7ca0: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
7cb0: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
7cc0: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
7cd0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
7ce0: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
7cf0: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
7d00: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
7d10: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7d20: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
7d30: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
7d40: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
7d50: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
7d60: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
7d70: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
7d80: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7d90: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7da0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7db0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7dc0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7dd0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7de0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
7df0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
7e00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
7e10: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
7e20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7e30: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7e40: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7e50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
7e60: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20   *pPrior;.  if( 
7e70: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7e80: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7e90: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7ea0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
7eb0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7ec0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7ed0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
7ee0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
7ef0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
7f00: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
7f10: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
7f20: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
7f30: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7f40: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
7f50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7f60: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
7f70: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
7f80: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
7f90: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
7fa0: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
7fb0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
7fc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7fd0: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
7fe0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7ff0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
8000: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
8010: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
8020: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8030: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
8040: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
8050: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
8060: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
8070: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
8080: 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
8090: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
80a0: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  w;.  pNew->pNext
80b0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
80c0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
80d0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
80e0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
80f0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
8100: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8110: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
8120: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
8130: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
8140: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
8150: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
8160: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
8170: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
8180: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  l;.  pNew->pRigh
8190: 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65  tmost = 0;.  pNe
81a0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
81b0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
81c0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
81d0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
81e0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
81f0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e   -1;.  return pN
8200: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
8210: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
8220: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8230: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
8240: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
8250: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
8260: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
8270: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8280: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
8290: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
82a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
82b0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
82c0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
82d0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
82e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
82f0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
8300: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
8310: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
8320: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
8330: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
8340: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
8350: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
8360: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
8370: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
8380: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
8390: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
83a0: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
83b0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
83c0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
83d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
83e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
83f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8400: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8410: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
8420: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
8430: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
8440: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
8450: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
8460: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
8470: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
8480: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
8490: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
84a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
84b0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
84c0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
84d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
84e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
84f0: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
8500: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8510: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8520: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8530: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
8540: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
8550: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
8560: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
8570: 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  ->a==0 ) goto no
8580: 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _mem;.  }else if
8590: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
85a0: 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  & (pList->nExpr-
85b0: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  1))==0 ){.    st
85c0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
85d0: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72  em *a;.    asser
85e0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
85f0: 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  0 );.    a = sql
8600: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8610: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  , pList->a, pLis
8620: 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f  t->nExpr*2*sizeo
8630: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
8640: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
8650: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
8660: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
8670: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
8680: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
8690: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31  >a!=0 );.  if( 1
86a0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
86b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
86c0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
86d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
86e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
86f0: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  m, 0, sizeof(*pI
8700: 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d  tem));.    pItem
8710: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
8720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
8730: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
8740: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
8750: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
8760: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
8770: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
8780: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
8790: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
87a0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
87b0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
87c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
87d0: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
87e0: 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e  a[].zName elemen
87f0: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
8800: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
8810: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
8820: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8830: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
8840: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
8850: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
8860: 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64  But pName should
8870: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
8880: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
8890: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
88a0: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
88b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
88c0: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
88d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
88e0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20  prListSetName(. 
88f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8900: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
8910: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8920: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8930: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
8940: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
8950: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
8960: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
8970: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8980: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
8990: 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20   int dequote    
89a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
89b0: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61   to cause the na
89c0: 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65  me to be dequote
89d0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
89e0: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
89f0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8a00: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
8a10: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
8a20: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8a30: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
8a40: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
8a50: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70  nExpr>0 );.    p
8a60: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
8a70: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
8a80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
8a90: 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b  tem->zName==0 );
8aa0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
8ab0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8ac0: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
8ad0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
8ae0: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65  ->n);.    if( de
8af0: 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e  quote && pItem->
8b00: 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44  zName ) sqlite3D
8b10: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
8b20: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ame);.  }.}../*.
8b30: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c  ** Set the ExprL
8b40: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c  ist.a[].zSpan el
8b50: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73  ement of the mos
8b60: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8b70: 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20   item.** on the 
8b80: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
8b90: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67  .**.** pList mig
8ba0: 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f  ht be NULL follo
8bb0: 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  wing an OOM erro
8bc0: 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68  r.  But pSpan sh
8bd0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a  ould never be.**
8be0: 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d   NULL.  If a mem
8bf0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
8c00: 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65  ails, the pParse
8c10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8c20: 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65  ed flag.** is se
8c30: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8c40: 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61  e3ExprListSetSpa
8c50: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
8c60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
8c70: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8c80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8c90: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
8ca0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
8cb0: 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a   add the span. *
8cc0: 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53  /.  ExprSpan *pS
8cd0: 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pan         /* T
8ce0: 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64  he span to be ad
8cf0: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ded */.){.  sqli
8d00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8d10: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
8d20: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e  pList!=0 || db->
8d30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
8d40: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
8d50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8d60: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8d70: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
8d80: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
8d90: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
8da0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
8db0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
8dc0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74  locFailed || pIt
8dd0: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e  em->pExpr==pSpan
8de0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73  ->pExpr );.    s
8df0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8e00: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
8e10: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
8e20: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
8e30: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
8e40: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
8e80: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
8e90: 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art));.  }.}../*
8ea0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
8eb0: 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73  ssion list pELis
8ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  t contains more 
8ed0: 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d  than iLimit elem
8ee0: 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  ents,.** leave a
8ef0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8f00: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
8f10: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
8f20: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20  stCheckLength(. 
8f30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
8f40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8f50: 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  st,.  const char
8f60: 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69   *zObject.){.  i
8f70: 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e  nt mx = pParse->
8f80: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8f90: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b  E_LIMIT_COLUMN];
8fa0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
8fb0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
8fc0: 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65  Expr==mx );.  te
8fd0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
8fe0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
8ff0: 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  =mx+1 );.  if( p
9000: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
9010: 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20  >nExpr>mx ){.   
9020: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9030: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
9040: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
9050: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
9060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
9070: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
9080: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
9090: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
90a0: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
90b0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
90c0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
90d0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
90e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
90f0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
9100: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
9110: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
9120: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
9130: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
9140: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
9150: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
9160: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9170: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
9180: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
9190: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
91a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
91b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
91c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
91d0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
91e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
91f0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
9200: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
9210: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
9220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
9230: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
9240: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20  lker callbacks. 
9250: 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20   Walker.u.pi is 
9260: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9270: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  an integer.  The
9280: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
9290: 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72  checking an expr
92a0: 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a  ession to see.**
92b0: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73   if it is a cons
92c0: 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b  tant.  Set *Walk
92d0: 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20  er.u.pi to 0 if 
92e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
92f0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  s.** not constan
9300: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  t..**.** These c
9310: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
9320: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
9330: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
9340: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
9350: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9360: 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73  stant().**     s
9370: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9380: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a  tantNotJoin().**
9390: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
93a0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
93b0: 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61  tion().**.*/.sta
93c0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
93d0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
93e0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
93f0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
9400: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20  If pWalker->u.i 
9410: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
9420: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
9430: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
9440: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
9450: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9460: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
9470: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
9480: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
9490: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
94a0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
94b0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
94c0: 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73  .i==3 && ExprHas
94d0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
94e0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
94f0: 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
9500: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  u.i = 0;.    ret
9510: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9520: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
9530: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
9540: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
9550: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
9560: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
9570: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
9580: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
9590: 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  nd pWalker->u.i=
95a0: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
95b0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
95c0: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
95d0: 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30  .i==2 ) return 0
95e0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
95f0: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63  through */.    c
9600: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
9610: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
9620: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
9630: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
9640: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
9650: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9660: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
9670: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
9680: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9690: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
96a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
96b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
96c0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
96d0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
96e0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
96f0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57 61  UMN );.      pWa
9700: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
9710: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9720: 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61 75  Abort;.    defau
9730: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
9740: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9750: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
9760: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
9770: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
9780: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
9790: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
97a0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
97b0: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
97c0: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
97d0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
97e0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
97f0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
9800: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
9810: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9820: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9830: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9840: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9850: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9860: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
9870: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
9880: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
9890: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
98a0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
98b0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
98c0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
98d0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
98e0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
98f0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9900: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9910: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9920: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9930: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9940: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9950: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9960: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9970: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9980: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
9990: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
99a0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
99b0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
99c0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
99d0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
99e0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
99f0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9a00: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9a10: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9a20: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9a30: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9a40: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9a50: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9a60: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9a70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9a80: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
9a90: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
9aa0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
9ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
9ac0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9ad0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
9ae0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9af0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9b00: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9b10: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9b20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9b30: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9b40: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9b50: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9b60: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9b70: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9b80: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
9b90: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
9ba0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
9bb0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
9bc0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9bd0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9be0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9bf0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9c00: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9c10: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9c20: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9c30: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9c40: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9c50: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9c60: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9c70: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9c80: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
9c90: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
9ca0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
9cb0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
9cc0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
9cd0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
9ce0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9cf0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9d00: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9d10: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9d20: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9d30: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9d40: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9d50: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9d60: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9d70: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9d80: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9d90: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
9da0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
9db0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
9dc0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
9dd0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
9de0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
9df0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9e00: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9e10: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9e20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9e30: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9e40: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9e50: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9e60: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9e70: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9e80: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
9e90: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
9ea0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9eb0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
9ec0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
9ed0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
9ee0: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
9ef0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
9f00: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
9f10: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
9f20: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
9f30: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
9f40: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
9f50: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
9f60: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
9f70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9f80: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
9f90: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
9fa0: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
9fb0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
9fc0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
9fd0: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
9fe0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
9ff0: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
a000: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
a010: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
a020: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a030: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
a040: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a050: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
a070: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
a080: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
a090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a0a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
a0b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
a0c0: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
a0d0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
a0e0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
a0f0: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
a100: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
a110: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
a120: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a130: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
a140: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
a150: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a160: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
a170: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
a180: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
a190: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
a1a0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
a1b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
a1c0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
a1d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a1e0: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
a1f0: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
a200: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
a210: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a220: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
a230: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
a240: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
a250: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
a260: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
a270: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
a280: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
a290: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
a2a0: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
a2b0: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
a2c0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
a2d0: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
a2e0: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
a2f0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
a300: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
a310: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
a320: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
a330: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
a340: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
a350: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
a360: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
a370: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
a380: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
a390: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
a3a0: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
a3b0: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
a3c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
a3d0: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
a3e0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
a3f0: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
a400: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
a410: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
a420: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
a430: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
a440: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
a450: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
a460: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
a470: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
a480: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
a490: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
a4a0: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
a4b0: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
a4c0: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
a4d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 64 65 66  eturn 0;.    def
a4e0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
a4f0: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
a500: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
a510: 50 5f 49 73 4e 75 6c 6c 20 69 6e 73 74 72 75 63  P_IsNull instruc
a520: 74 69 6f 6e 20 74 68 61 74 20 74 65 73 74 73 20  tion that tests 
a530: 72 65 67 69 73 74 65 72 20 69 52 65 67 20 61 6e  register iReg an
a540: 64 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 6c 6f  d jumps.** to lo
a550: 63 61 74 69 6f 6e 20 69 44 65 73 74 20 69 66 20  cation iDest if 
a560: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 69 52 65  the value in iRe
a570: 67 20 69 73 20 4e 55 4c 4c 2e 20 20 54 68 65 20  g is NULL.  The 
a580: 76 61 6c 75 65 20 69 6e 20 69 52 65 67 20 0a 2a  value in iReg .*
a590: 2a 20 77 61 73 20 63 6f 6d 70 75 74 65 64 20 62  * was computed b
a5a0: 79 20 70 45 78 70 72 2e 20 20 49 66 20 77 65 20  y pExpr.  If we 
a5b0: 63 61 6e 20 6c 6f 6f 6b 20 61 74 20 70 45 78 70  can look at pExp
a5c0: 72 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  r at compile-tim
a5d0: 65 20 61 6e 64 0a 2a 2a 20 64 65 74 65 72 6d 69  e and.** determi
a5e0: 6e 65 20 74 68 61 74 20 69 74 20 63 61 6e 20 6e  ne that it can n
a5f0: 65 76 65 72 20 67 65 6e 65 72 61 74 65 20 61 20  ever generate a 
a600: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 4f  NULL, then the O
a610: 50 5f 49 73 4e 75 6c 6c 20 6f 70 65 72 61 74 69  P_IsNull operati
a620: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
a630: 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
a640: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e  lite3ExprCodeIsN
a650: 75 6c 6c 4a 75 6d 70 28 0a 20 20 56 64 62 65 20  ullJump(.  Vdbe 
a660: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *v,            /
a670: 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
a680: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
a690: 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  .  const Expr *p
a6a0: 45 78 70 72 2c 20 20 2f 2a 20 4f 6e 6c 79 20 67  Expr,  /* Only g
a6b0: 65 6e 65 72 61 74 65 20 4f 50 5f 49 73 4e 75 6c  enerate OP_IsNul
a6c0: 6c 20 69 66 20 74 68 69 73 20 65 78 70 72 20 63  l if this expr c
a6d0: 61 6e 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  an be NULL */.  
a6e0: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
a6f0: 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 65 20      /* Test the 
a700: 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
a710: 67 69 73 74 65 72 20 66 6f 72 20 4e 55 4c 4c 20  gister for NULL 
a720: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 73 74 20 20  */.  int iDest  
a730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
a740: 20 68 65 72 65 20 69 66 20 74 68 65 20 76 61 6c   here if the val
a750: 75 65 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 29 7b  ue is null */.){
a760: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
a770: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
a780: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
a790: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a7a0: 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 2c 20  P_IsNull, iReg, 
a7b0: 69 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iDest);.  }.}../
a7c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
a7d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
a7e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
a7f0: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
a800: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
a810: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
a820: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
a830: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
a840: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
a850: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
a860: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a870: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
a880: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
a890: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
a8a0: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
a8b0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
a8c0: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
a8d0: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
a8e0: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
a8f0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
a900: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
a910: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
a920: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
a930: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
a940: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
a950: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
a960: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
a970: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
a980: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
a990: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
a9a0: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
a9b0: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
a9c0: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
a9d0: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
a9e0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
a9f0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
aa00: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
aa10: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
aa20: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
aa30: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
aa40: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
aa50: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
aa60: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
aa70: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
aa80: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
aa90: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
aaa0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
aab0: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
aac0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
aad0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
aae0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
aaf0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
ab00: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
ab10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ab20: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
ab30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ab40: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
ab50: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
ab60: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
ab70: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
ab80: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
ab90: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
aba0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
abb0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
abc0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
abd0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
abe0: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
abf0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
ac00: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
ac10: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
ac20: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
ac30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
ac40: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
ac50: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
ac60: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
ac70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
ac80: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
ac90: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
aca0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
acb0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
acc0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
acd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
ace0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
acf0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
ad00: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
ad10: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
ad20: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
ad30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ad40: 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  n true if we are
ad50: 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20   able to the IN 
ad60: 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a  operator optimiz
ad70: 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75  ation on a.** qu
ad80: 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
ad90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e  **.**       x IN
ada0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
adb0: 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45  .** Where the SE
adc0: 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69  LECT... clause i
add0: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62  s as specified b
ade0: 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  y the parameter 
adf0: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
ae00: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65  ne..**.** The Se
ae10: 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73  lect object pass
ae20: 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64  ed in has alread
ae30: 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73  y been preproces
ae40: 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72  sed and no.** er
ae50: 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66  rors have been f
ae60: 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ound..*/.#ifndef
ae70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ae80: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
ae90: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
aea0: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
aeb0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
aec0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
aed0: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
aee0: 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Tab;.  if( p==0 
aef0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af10: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
af20: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
af30: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
af40: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af60: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
af70: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
af80: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
af90: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
afa0: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74  regate) ){.    t
afb0: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
afc0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
afd0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
afe0: 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
aff0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b000: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
b010: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
b020: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
b030: 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
b040: 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e    return 0; /* N
b050: 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  o DISTINCT keywo
b060: 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67  rd and no aggreg
b070: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
b080: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
b090: 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b0b0: 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   Has no GROUP BY
b0c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
b0d0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
b0e0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b0f0: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49      /* Has no LI
b100: 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  MIT clause */.  
b110: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
b120: 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  et==0 );        
b130: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
b140: 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53  IT means no OFFS
b150: 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ET */.  if( p->p
b160: 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
b170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b180: 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63  * Has no WHERE c
b190: 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20  lause */.  pSrc 
b1a0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
b1b0: 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
b1c0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
b1d0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
b1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
b1f0: 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20  le term in FROM 
b200: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
b210: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
b220: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
b230: 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f     /* FROM is no
b240: 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20  t a subquery or 
b250: 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d  view */.  pTab =
b260: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
b270: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54  ;.  if( NEVER(pT
b280: 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  ab==0) ) return 
b290: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  0;.  assert( pTa
b2a0: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b2c0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
b2d0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
b2e0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
b2f0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
b300: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
b310: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
b320: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
b330: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
b340: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
b350: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
b360: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
b370: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
b380: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
b390: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
b3a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
b3b0: 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
b3c0: 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20   /* Result is a 
b3d0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75  column */.  retu
b3e0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
b3f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
b400: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
b410: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65   Code an OP_Once
b420: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
b430: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
b440: 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65  for its flag. Re
b450: 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64  turn the .** add
b460: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ress of the new 
b470: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
b480: 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  int sqlite3CodeO
b490: 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nce(Parse *pPars
b4a0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
b4b0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b4c0: 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
b4d0: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
b4e0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
b4f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
b500: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b510: 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f  Once, pParse->nO
b520: 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nce++);.}../*.**
b530: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
b540: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
b550: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
b560: 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
b570: 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
b580: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
b590: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
b5a0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
b5b0: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
b5c0: 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
b5d0: 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
b5e0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
b5f0: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
b600: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
b610: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
b620: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
b630: 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
b640: 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
b650: 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
b660: 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
b670: 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
b680: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
b690: 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
b6a0: 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
b6b0: 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
b6c0: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
b6d0: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
b6e0: 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
b6f0: 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 52  bject that the R
b700: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
b710: 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
b720: 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
b730: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
b740: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
b750: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
b760: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
b770: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
b780: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
b790: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
b7a0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
b7b0: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
b7c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
b7d0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
b7e0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
b7f0: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
b800: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
b810: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
b820: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
b830: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
b840: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
b850: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
b860: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b880: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
b890: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
b8a0: 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
b8b0: 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
b8c0: 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
b8d0: 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
b8e0: 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
b8f0: 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
b900: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
b910: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
b920: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
b930: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
b940: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
b950: 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
b960: 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
b970: 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
b980: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
b990: 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
b9a0: 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
b9b0: 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
b9c0: 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
b9d0: 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 72  int to the epher
b9e0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
b9f0: 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
ba00: 73 74 69 6e 67 20 74 61 62 6c 65 2e 20 20 0a 2a  sting table.  .*
ba10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
ba20: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
ba30: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
ba40: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
ba50: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
ba60: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
ba70: 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  t members, skipp
ba80: 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ing any duplicat
ba90: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
baa0: 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c   an.** epheremal
bab0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
bac0: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
bad0: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
bae0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
baf0: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
bb00: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
bb10: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
bb20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
bb30: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
bb40: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
bb50: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
bb60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
bb70: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
bb80: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
bb90: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
bba0: 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
bbb0: 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
bbc0: 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68  hip tests. In th
bbd0: 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72  is case an epher
bbe0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
bbf0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
bc00: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
bc10: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
bc20: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
bc30: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
bc40: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
bc50: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
bc60: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
bc70: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
bc80: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
bc90: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
bca0: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
bcb0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64  function.** need
bcc0: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  s to know whethe
bcd0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72  r or not the str
bce0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
bcf0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20  an SQL NULL .** 
bd00: 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74  value in order t
bd10: 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c  o correctly eval
bd20: 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  uate expressions
bd30: 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20   like "X IN (Y, 
bd40: 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65  Z)"..** If there
bd50: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
bd60: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
bd70: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
bd80: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
bd90: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
bda0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
bdb0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
bdc0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
bdd0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f  tten.** to *prNo
bde0: 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65  tFound. If there
bdf0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
be00: 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
be10: 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
be20: 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e  value, then *prN
be30: 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20  otFound is left 
be40: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
be50: 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
be60: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
be70: 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
be80: 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75  red in *prNotFou
be90: 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20  nd, then.** its 
bea0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73  initial value is
beb0: 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28   NULL.  If the (
bec0: 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65  ...) does not re
bed0: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
bee0: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
bef0: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
bf00: 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20  i.e. the SELECT 
bf10: 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29  within the (...)
bf20: 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61  .** is a correla
bf30: 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74 68  ted subquery) th
bf40: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
bf50: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65  the allocated re
bf60: 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73  gister is.** res
bf70: 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20  et to NULL each 
bf80: 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65 72  time the subquer
bf90: 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73  y is rerun. This
bfa0: 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63   allows the.** c
bfb0: 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62  aller to use vdb
bfc0: 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  e code equivalen
bfd0: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
bfe0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
bff0: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
c000: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
c010: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
c020: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
c030: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
c040: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
c050: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
c060: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
c070: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
c080: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
c090: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
c0a0: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
c0b0: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
c0c0: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
c0d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c0e0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
c0f0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
c100: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
c110: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
c120: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
c130: 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
c160: 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
c170: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
c180: 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
c1b0: 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
c1c0: 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
c1d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
c1e0: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
c1f0: 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
c200: 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
c210: 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d  t mustBeUnique =
c220: 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29   (prNotFound==0)
c230: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52  ;   /* True if R
c240: 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
c250: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
c260: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c270: 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
c280: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
c290: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
c2a0: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
c2b0: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a  ==TK_IN );..  /*
c2c0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
c2d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
c2e0: 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
c2f0: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
c300: 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
c310: 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
c320: 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
c330: 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
c340: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
c350: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78  ..  */.  p = (Ex
c360: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
c370: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c380: 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ? pX->x.pSelect 
c390: 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  : 0);.  if( ALWA
c3a0: 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  YS(pParse->nErr=
c3b0: 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64 61  =0) && isCandida
c3c0: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b  teForInOpt(p) ){
c3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
c3e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c400: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c410: 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
c420: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
c450: 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  >. */.    Expr *
c460: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c   /* Expression <
c490: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
c4a0: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
c4d0: 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e  f column <column
c4e0: 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  > */.    int iDb
c4f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
c520: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20  for pTab */..   
c530: 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20 20   assert( p );   
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
c560: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c570: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c580: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c590: 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
c5a0: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
c5b0: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c5c0: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c5d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c5e0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
c5f0: 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
c600: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c610: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c620: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
c630: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
c640: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
c650: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
c660: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
c670: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
c680: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[0].pTab;.    
c690: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
c6a0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c6b0: 20 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d     iCol = pExpr-
c6c0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20  >iColumn;.   .  
c6d0: 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
c6e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 20 61 6e 64  VerifyCookie and
c6f0: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
c700: 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
c710: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
c720: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
c730: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c740: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
c750: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
c760: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
c770: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
c780: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
c790: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
c7a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
c7b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c7c0: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
c7d0: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
c7e0: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
c7f0: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
c800: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
c810: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
c820: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
c830: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
c840: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
c850: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
c860: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
c870: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c880: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
c890: 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73  .      iAddr = s
c8a0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
c8b0: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 73  Parse);..      s
c8c0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
c8d0: 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
c8e0: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
c8f0: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
c900: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
c910: 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
c920: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c930: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
c940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
c950: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
c980: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  iable */..      
c990: 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
c9a0: 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 62   sequence used b
c9b0: 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  y the comparison
c9c0: 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73  . If an index is
c9d0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
c9e0: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
c9f0: 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69   a temp-table, i
ca00: 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65  t must be ordere
ca10: 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20  d according.    
ca20: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c    ** to this col
ca30: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
ca40: 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53    */.      CollS
ca50: 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
ca60: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
ca70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
ca80: 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29  X->pLeft, pExpr)
ca90: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
caa0: 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
cab0: 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
cac0: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
cad0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
cae0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
caf0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
cb00: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c  inity of the col
cb10: 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
cb20: 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69   it is not, it i
cb30: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
cb40: 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
cb50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cb60: 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
cb70: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  = sqlite3IndexAf
cb80: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61  finityOk(pX, pTa
cb90: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
cba0: 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20  finity);..      
cbb0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
cbc0: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
cbd0: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
cbe0: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
cbf0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
cc00: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
cc10: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
cc20: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
cc30: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
cc40: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64  db, ENC(db), pId
cc50: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29  x->azColl[0], 0)
cc60: 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20 20  ==pReq.         
cc70: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
cc80: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
cc90: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
cca0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
ccb0: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
ccc0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
ccd0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
cce0: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
ccf0: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
cd00: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
cd10: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
cd20: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
cd30: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
cd40: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
cd50: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
cd60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd70: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
cd80: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
cd90: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
cdc0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
cdd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
cde0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
cdf0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
ce00: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
ce10: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
ce20: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
ce30: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ce40: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
ce50: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
ce60: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
ce70: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
ce80: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
ce90: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
cea0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
cec0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ced0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
cee0: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20  NotFound);.     
cef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
cf00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cf10: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
cf20: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
cf30: 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20  ld not found an 
cf40: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
cf50: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
cf60: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
cf70: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
cf80: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
cf90: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
cfa0: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
cfb0: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ob..    */.    d
cfc0: 6f 75 62 6c 65 20 73 61 76 65 64 4e 51 75 65 72  ouble savedNQuer
cfd0: 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  yLoop = pParse->
cfe0: 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20  nQueryLoop;.    
cff0: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
d000: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
d010: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
d020: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
d030: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
d040: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
d050: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
d060: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
d070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d080: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d090: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20  *prNotFound);.  
d0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 74    }else{.      t
d0b0: 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
d0c0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3e 28 64 6f 75  >nQueryLoop>(dou
d0d0: 62 6c 65 29 31 20 29 3b 0a 20 20 20 20 20 20 70  ble)1 );.      p
d0e0: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
d0f0: 70 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  p = (double)1;. 
d100: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
d110: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
d120: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
d130: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
d140: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
d150: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
d160: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
d170: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d180: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
d190: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
d1a0: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
d1b0: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
d1c0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
d1d0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
d1e0: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
d1f0: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
d200: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
d210: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
d220: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d230: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
d240: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
d250: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
d260: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
d270: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
d280: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
d290: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
d2a0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
d2b0: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
d2c0: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
d2d0: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
d2e0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
d2f0: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
d300: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
d310: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
d320: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
d330: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
d340: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
d350: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
d360: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
d370: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
d380: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
d390: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
d3a0: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
d3b0: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
d3c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
d3d0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
d3e0: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
d3f0: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
d400: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
d410: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
d420: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
d430: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
d440: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
d450: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
d460: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
d470: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
d480: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
d490: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
d4a0: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
d4b0: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
d4c0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
d4d0: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
d4e0: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
d4f0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
d500: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
d510: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
d520: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
d530: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
d540: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
d550: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
d560: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
d570: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
d580: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
d590: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
d5a0: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
d5b0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
d5c0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
d5d0: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
d5e0: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
d5f0: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
d600: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
d610: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
d620: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
d630: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
d640: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
d650: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
d660: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
d670: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
d680: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
d690: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
d6a0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
d6b0: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
d6c0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
d6d0: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
d6e0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
d6f0: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
d700: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
d710: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
d720: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
d730: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
d740: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
d750: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
d760: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
d770: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
d780: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
d790: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
d7a0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
d7b0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
d7c0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
d7d0: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
d7e0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
d7f0: 72 65 73 65 6e 73 65 20 6f 72 20 61 62 73 65 6e  resense or absen
d800: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
d810: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
d820: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
d830: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
d840: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
d850: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
d860: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
d870: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
d880: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
d890: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
d8a0: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
d8b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d8c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
d8d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
d8e0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d8f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d900: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d910: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
d920: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
d930: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
d940: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
d950: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
d960: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
d970: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
d980: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
d990: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
d9a0: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
d9b0: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
d9c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
d9d0: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
d9e0: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
d9f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
da00: 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ddr = -1;       
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da20: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
da30: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
da40: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
da70: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
da80: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
da90: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
daa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
dab0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
dac0: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
dad0: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
dae0: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
daf0: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
db00: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
db10: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
db20: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
db30: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
db40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
db50: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
db60: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
db70: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
db80: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
db90: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
dba0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
dbb0: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
dbc0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
dbd0: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
dbe0: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
dbf0: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
dc00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
dc10: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
dc20: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
dc30: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
dc40: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
dc50: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
dc60: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
dc70: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
dc80: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
dc90: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
dca0: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
dcb0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
dcc0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
dcd0: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
dce0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
dcf0: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 23 69  pParse);.  }..#i
dd00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dd10: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
dd20: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
dd30: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
dd40: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
dd50: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
dd60: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
dd70: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
dd80: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
dd90: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
dda0: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
ddb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
ddc0: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
ddd0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
dde0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
ddf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
de00: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
de10: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
de20: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
de30: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
de40: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
de50: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
de60: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
de70: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
de80: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
de90: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
dea0: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
deb0: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 4b 65  e IN */.      Ke
dec0: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 20 20  yInfo keyInfo;  
ded0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
dee0: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 67 65 6e  info for the gen
def0: 65 72 61 74 65 64 20 74 61 62 6c 65 20 2a 2f 0a  erated table */.
df00: 20 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20        static u8 
df10: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
df20: 20 20 2f 2a 20 46 61 6b 65 20 61 53 6f 72 74 4f    /* Fake aSortO
df30: 72 64 65 72 20 66 6f 72 20 6b 65 79 49 6e 66 6f  rder for keyInfo
df40: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
df50: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
df60: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
df70: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
df80: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
df90: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
dfa0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
dfb0: 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
dfc0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
dfd0: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  tor */..      if
dfe0: 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29  ( rMayHaveNull )
dff0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e000: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e010: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48  P_Null, 0, rMayH
e020: 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  aveNull);.      
e030: 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  }..      affinit
e040: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
e050: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
e060: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
e070: 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
e080: 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
e090: 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
e0a0: 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
e0b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
e0c0: 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
e0d0: 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
e0e0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
e0f0: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
e100: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
e110: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
e120: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
e130: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
e140: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
e150: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
e160: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
e170: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
e180: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
e190: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
e1a0: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
e1b0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e1c0: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
e1d0: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
e1e0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
e1f0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
e200: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
e210: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
e220: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
e230: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
e240: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
e250: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
e260: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
e270: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
e280: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
e290: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
e2a0: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
e2b0: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
e2c0: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
e2d0: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
e2e0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
e2f0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
e300: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
e310: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
e320: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
e330: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
e340: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
e350: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
e360: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e370: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
e380: 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
e390: 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b  able, !isRowid);
e3a0: 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48  .      if( rMayH
e3b0: 61 76 65 4e 75 6c 6c 3d 3d 30 20 29 20 73 71 6c  aveNull==0 ) sql
e3c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
e3d0: 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
e3e0: 52 45 44 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  RED);.      mems
e3f0: 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20  et(&keyInfo, 0, 
e400: 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29  sizeof(keyInfo))
e410: 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e  ;.      keyInfo.
e420: 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nField = 1;.    
e430: 20 20 6b 65 79 49 6e 66 6f 2e 61 53 6f 72 74 4f    keyInfo.aSortO
e440: 72 64 65 72 20 3d 20 26 73 6f 72 74 4f 72 64 65  rder = &sortOrde
e450: 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  r;..      if( Ex
e460: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
e470: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
e480: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
e490: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
e4a0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
e4b0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
e4c0: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
e4d0: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
e4e0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
e4f0: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
e500: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
e510: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
e520: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
e530: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
e540: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
e550: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
e560: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
e570: 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
e580: 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
e590: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
e5a0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
e5b0: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
e5c0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
e5d0: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
e5e0: 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66  ffSdst = (u8)aff
e5f0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61  inity;.        a
e600: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
e610: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
e620: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
e630: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
e640: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c  r->x.pSelect->iL
e650: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
e660: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
e670: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
e680: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64  r->x.pSelect, &d
e690: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
e6a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
e6b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
e6c0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
e6d0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
e6e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
e6f0: 41 59 53 28 70 45 4c 69 73 74 21 3d 30 20 26 26  AYS(pEList!=0 &&
e700: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
e710: 29 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  ) ){ .          
e720: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
e730: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
e740: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
e750: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e760: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
e770: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
e780: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e790: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
e7a0: 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
e7b0: 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  x.pList!=0) ){. 
e7c0: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
e7d0: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
e7e0: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
e7f0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
e800: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
e810: 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
e820: 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
e830: 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
e840: 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
e850: 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
e860: 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
e870: 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
e880: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
e890: 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
e8a0: 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
e8b0: 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
e8c0: 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
e8d0: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
e8e0: 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
e8f0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
e900: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
e910: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
e920: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
e930: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
e940: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
e950: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e960: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
e970: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
e980: 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  3;..        if( 
e990: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
e9a0: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
e9b0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
e9c0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
e9d0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
e9e0: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
e9f0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ea00: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
ea10: 3b 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  ;.        keyInf
ea20: 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 26  o.aSortOrder = &
ea30: 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20  sortOrder;..    
ea40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
ea50: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
ea60: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
ea70: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
ea80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
ea90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
eaa0: 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
eab0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
eac0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
ead0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eae0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
eaf0: 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  2);.        for(
eb00: 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
eb10: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
eb20: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
eb30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
eb40: 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
eb50: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
eb60: 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
eb70: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
eb80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
eb90: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
eba0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
ebb0: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
ebc0: 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
ebd0: 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
ebe0: 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
ebf0: 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
ec00: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
ec10: 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
ec20: 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
ec30: 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
ec40: 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
ec50: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
ec60: 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
ec70: 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
ec80: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
ec90: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73           if( tes
eca0: 74 41 64 64 72 3e 3d 30 20 26 26 20 21 73 71 6c  tAddr>=0 && !sql
ecb0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
ecc0: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
ecd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ece0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
ecf0: 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 20  , testAddr);.   
ed00: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
ed10: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  r = -1;.        
ed20: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
ed30: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
ed40: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
ed50: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
ed60: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
ed70: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
ed80: 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45  owid && sqlite3E
ed90: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
eda0: 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b  , &iValToIns) ){
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
edc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
edd0: 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
ede0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
edf0: 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20  2, iValToIns);. 
ee00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d              r3 =
ee20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ee30: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
ee40: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
ee50: 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
ee60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ee70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee80: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
ee90: 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20  Int, r3,.       
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eec0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
eed0: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  v)+2);.         
eee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eef0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
ef00: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
ef10: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
ef20: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
ef40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ef50: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
ef60: 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
ef70: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
ef80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ef90: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
efa0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
efb0: 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
efc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
efd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
efe0: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
eff0: 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
f000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f020: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
f030: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
f040: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
f050: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
f060: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f070: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
f080: 20 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77        if( !isRow
f090: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  id ){.        sq
f0a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f0b0: 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
f0c0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)&keyInfo, P4_
f0d0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
f0e0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f0f0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
f100: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
f110: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
f120: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f130: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
f140: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
f150: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
f160: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
f170: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
f180: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
f190: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
f1a0: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
f1b0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
f1c0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
f1d0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
f1e0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
f1f0: 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
f200: 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
f210: 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
f220: 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
f230: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
f240: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
f250: 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
f260: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
f270: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f280: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
f2b0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
f2c0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
f2d0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
f300: 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72  al with SELECt r
f310: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20  esult */..      
f320: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
f330: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
f340: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f350: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f360: 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
f370: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f380: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
f390: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
f3a0: 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61  LECT );..      a
f3b0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
f3c0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
f3d0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
f3e0: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
f3f0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
f400: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
f410: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
f420: 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
f430: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
f440: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
f450: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
f460: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
f470: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
f480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f490: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
f4a0: 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
f4b0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f4c0: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
f4d0: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
f4e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f4f0: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
f500: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
f510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f520: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f530: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
f540: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
f550: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f560: 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
f570: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
f580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f590: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
f5a0: 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
f5b0: 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
f5c0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
f5d0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
f5e0: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
f620: 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
f630: 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
f640: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f650: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
f660: 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
f670: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
f680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f690: 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50  rReg = dest.iSDP
f6a0: 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
f6b0: 65 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 45  etIrreducible(pE
f6c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
f6d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
f6e0: 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20  if( testAddr>=0 
f6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f700: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
f710: 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73  stAddr);.  }.  s
f720: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
f730: 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 0a  op(pParse, 1);..
f740: 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d    return rReg;.}
f750: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f760: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
f770: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f780: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f790: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f7a0: 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65  code for an IN e
f7b0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
f7c0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
f7d0: 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20  CT ...).**      
f7e0: 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c  x IN (value, val
f7f0: 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ue, ...).**.** T
f800: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
f810: 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61  e (LHS) is a sca
f820: 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  lar expression. 
f830: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
f840: 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73  side (RHS).** is
f850: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72   an array of zer
f860: 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73  o or more values
f870: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
f880: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
f890: 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61   LHS is.** conta
f8a0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
f8b0: 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20  RHS.  The value 
f8c0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
f8d0: 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55  n is unknown (NU
f8e0: 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48  LL).** if the LH
f8f0: 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  S is NULL or if 
f900: 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63  the LHS is not c
f910: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
f920: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a  the RHS and the.
f930: 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  ** RHS contains 
f940: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
f950: 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
f960: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
f970: 72 61 74 65 73 20 63 6f 64 65 20 77 69 6c 6c 20  rates code will 
f980: 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61  jump to destIfFa
f990: 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
f9a0: 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
f9b0: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
f9c0: 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
f9d0: 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
f9e0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
f9f0: 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
fa00: 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
fa10: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
fa20: 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
fa30: 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
fa40: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
fa50: 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
fa60: 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
fa70: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
fa80: 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
fa90: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
faa0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
fab0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
fac0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
fad0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
fae0: 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
faf0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
fb00: 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
fb10: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
fb20: 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
fb30: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
fb40: 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
fb50: 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
fb60: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
fb70: 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
fb80: 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
fb90: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
fba0: 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
fbb0: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
fbc0: 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
fbd0: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
fbe0: 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
fbf0: 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
fc00: 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
fc10: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
fc20: 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
fc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
fc40: 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
fc50: 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
fc60: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
fc70: 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
fc80: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fca0: 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
fcb0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
fcc0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
fcd0: 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
fce0: 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
fcf0: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
fd00: 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
fd10: 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
fd20: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
fd30: 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
fd40: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
fd50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
fd60: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
fd70: 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
fd80: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
fd90: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
fda0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
fdb0: 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
fdc0: 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
fdd0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
fde0: 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
fdf0: 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
fe00: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
fe10: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
fe20: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
fe30: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
fe40: 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
fe50: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
fe60: 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
fe70: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
fe80: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
fe90: 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
fea0: 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
feb0: 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
fec0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
fed0: 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
fee0: 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
fef0: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
ff00: 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
ff10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
ff20: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
ff30: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
ff40: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ff50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
ff60: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
ff70: 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
ff80: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53  .  /* If the LHS
ff90: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
ffa0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
ffb0: 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
ffc0: 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  L depending.  **
ffd0: 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20   on whether the 
ffe0: 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20  RHS is empty or 
fff0: 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
10000 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  y..  */.  if( de
10010 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
10020 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20  False ){.    /* 
10030 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
10040 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
10050 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
10060 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
10070 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
10080 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  me. */.    sqlit
10090 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
100a0 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64  OP_IsNull, r1, d
100b0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  estIfNull);.  }e
100c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  lse{.    int add
100d0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
100e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
100f0 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20 73  Null, r1);.    s
10100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10110 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
10120 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
10130 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
10140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10150 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10160 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
10170 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10180 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
10190 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
101a0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
101b0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  D ){.    /* In t
101c0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
101d0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
101e0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20  f table b-tree. 
101f0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
10200 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10210 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
10220 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
10230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10240 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
10250 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
10260 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
10270 2c 20 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , r1);.  }else{.
10280 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
10290 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
102a0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
102b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
102c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
102d0 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31   OP_Affinity, r1
102e0 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
102f0 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  y, 1);..    /* I
10300 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
10310 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
10320 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10330 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
10340 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70  "x IN (...)" exp
10350 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
10360 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c  either 0 or NULL
10370 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20  . If the set.   
10380 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
10390 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
103a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
103b0 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20  0. If the set . 
103c0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
103d0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
103e0 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
103f0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
10400 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
10410 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
10420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 52     */.    if( rR
10430 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c 20  hsHasNull==0 || 
10440 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
10450 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
10460 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
10470 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e  runs if it is kn
10480 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  own at compile t
10490 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ime that the RHS
104a0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  .      ** cannot
104b0 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
104c0 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
104d0 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
104e0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22  .      ** of a "
104f0 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
10500 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  aint in the data
10510 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
10520 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
10530 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61  lso run this bra
10540 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65  nch if NULL is e
10550 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c  quivalent to FAL
10560 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  SE.      ** for 
10570 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  this particular 
10580 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
10590 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
105a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
105b0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
105c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
105d0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
105e0 20 31 29 3b 0a 0a 20 20 20 20 7d 65 6c 73 65 7b   1);..    }else{
105f0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
10600 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
10610 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
10620 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
10630 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
10640 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20  e presence of a 
10650 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20  NULL on the RHS 
10660 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e  makes a differen
10670 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ce in the.      
10680 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
10690 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
106a0 31 2c 20 6a 32 2c 20 6a 33 3b 0a 0a 20 20 20 20  1, j2, j3;..    
106b0 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
106c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
106d0 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
106e0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
106f0 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  so,.      ** the
10700 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
10710 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
10720 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  HS does not matt
10730 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20 20 20 20  er, so jump.    
10740 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66    ** over all of
10750 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 66   the code that f
10760 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20 20 2a 2f  ollows..      */
10770 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
10780 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
10790 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
107a0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
107b0 72 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 2f  r1, 1);..      /
107c0 2a 20 48 65 72 65 20 77 65 20 62 65 67 69 6e 20  * Here we begin 
107d0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  generating code 
107e0 74 68 61 74 20 72 75 6e 73 20 69 66 20 74 68 65  that runs if the
107f0 20 4c 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20   LHS is not.    
10800 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77    ** contained w
10810 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
10820 47 65 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f  Generate additio
10830 6e 61 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20  nal code that.  
10840 20 20 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65      ** tests the
10850 20 52 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20   RHS for NULLs. 
10860 20 49 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74   If the RHS cont
10870 61 69 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e  ains a NULL then
10880 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
10890 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
108a0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e  f there are no N
108b0 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20  ULLs in the RHS 
108c0 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75  then.      ** ju
108d0 6d 70 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  mp to destIfFals
108e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
108f0 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
10900 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
10910 6f 74 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  otNull, rRhsHasN
10920 75 6c 6c 29 3b 0a 20 20 20 20 20 20 6a 33 20 3d  ull);.      j3 =
10930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10940 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
10950 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
10960 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
10970 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10990 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
109a0 20 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20   rRhsHasNull);. 
109b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109c0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
109d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
109e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
109f0 64 64 49 6d 6d 2c 20 72 52 68 73 48 61 73 4e 75  ddImm, rRhsHasNu
10a00 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ll, 1);.      sq
10a10 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10a20 65 28 76 2c 20 6a 32 29 3b 0a 0a 20 20 20 20 20  e(v, j2);..     
10a30 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
10a40 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 72 67  appropriate targ
10a50 65 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  et depending on 
10a60 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
10a70 20 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20       ** the RHS 
10a80 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a  contains a NULL.
10a90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
10aa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10ab0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48  (v, OP_If, rRhsH
10ac0 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
10ad0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
10ae0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10af0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
10b00 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  IfFalse);..     
10b10 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64   /* The OP_Found
10b20 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
10b30 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73  his branch jumps
10b40 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c   here when true,
10b50 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69   .      ** causi
10b60 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49  ng the overall I
10b70 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  N expression eva
10b80 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20  luation to fall 
10b90 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a  through..      *
10ba0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
10bb0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
10bc0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
10bd0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10be0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10bf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
10c00 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c  CachePop(pParse,
10c10 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65   1);.  VdbeComme
10c20 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
10c30 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  xpr"));.}.#endif
10c40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10c50 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
10c60 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
10c70 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
10c80 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
10c90 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
10ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
10cb0 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
10cc0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
10cd0 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
10ce0 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
10cf0 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
10d00 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
10d10 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
10d20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10d30 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
10d40 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
10d50 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
10d60 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
10d70 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
10d80 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
10d90 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
10da0 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
10db0 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
10dc0 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
10dd0 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
10de0 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
10df0 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
10e00 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
10e10 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
10e20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
10e30 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
10e40 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
10e50 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
10e60 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
10e70 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
10e80 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
10e90 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
10ea0 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
10eb0 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
10ec0 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
10ed0 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  ble value;.    c
10ee0 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c  har *zV;.    sql
10ef0 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
10f00 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
10f10 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
10f20 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
10f30 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
10f40 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
10f50 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
10f60 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
10f70 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
10f80 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
10f90 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70  ue;.    zV = dup
10fa0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
10fb0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71  )&value);.    sq
10fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10fd0 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
10fe0 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52  Mem, 0, zV, P4_R
10ff0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
11000 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
11010 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
11020 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
11030 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
11040 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
11050 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
11060 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
11070 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
11080 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
11090 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
110a0 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
110b0 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
110c0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
110d0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
110e0 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
110f0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
11100 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11110 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
11120 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
11130 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
11140 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
11150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
11160 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
11170 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
11180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11190 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
111a0 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
111b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
111c0 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
111d0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
111e0 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
111f0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
11200 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
11210 20 3d 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34   = sqlite3Atoi64
11220 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
11230 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
11240 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
11250 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
11260 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
11270 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
11280 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  V;.      if( neg
11290 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
112a0 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
112b0 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
112c0 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  }.      zV = dup
112d0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
112e0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
112f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11300 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
11310 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
11320 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
11330 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
11340 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
11350 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
11360 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11370 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
11380 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
11390 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
113a0 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  "", z);.#else.  
113b0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
113c0 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
113d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
113e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
113f0 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
11400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11410 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
11420 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11430 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
11440 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
11450 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
11460 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
11470 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
11480 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
11490 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
114a0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
114b0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
114c0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
114d0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
114e0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
114f0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
11500 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
11510 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
11520 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
11530 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
11540 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
11550 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
11560 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
11570 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
11580 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11590 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
115a0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
115b0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
115c0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
115d0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
115e0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
115f0 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
11600 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
11610 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
11620 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
11630 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
11640 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
11650 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
11660 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
11670 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
11680 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
11690 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
116a0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
116b0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
116c0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
116d0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
116e0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
116f0 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
11700 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
11710 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
11720 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
11730 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
11740 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
11750 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
11760 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
11770 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
11780 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
11790 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
117a0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
117b0 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
117c0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
117d0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
117e0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
117f0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
11800 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
11810 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
11820 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
11830 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
11840 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11850 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
11860 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
11870 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
11880 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
11890 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
118a0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
118b0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
118c0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
118d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
118e0 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
118f0 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
11900 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
11910 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
11920 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
11930 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
11940 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
11950 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
11960 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
11970 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
11980 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
11990 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
119a0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
119b0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
119c0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
119d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
119e0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
119f0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
11a00 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
11a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11a20 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
11a30 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
11a40 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
11a50 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
11a60 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
11a70 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
11a80 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
11a90 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
11aa0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
11ab0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
11ac0 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
11ad0 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
11ae0 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
11af0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
11b00 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
11b10 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
11b20 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
11b30 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
11b40 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
11b50 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
11b60 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
11b70 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
11b80 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
11b90 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
11ba0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
11bb0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
11bc0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
11bd0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
11bf0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
11c00 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
11c10 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
11c20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
11c30 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
11c40 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
11c50 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
11c60 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
11c70 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
11c80 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
11c90 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
11ca0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
11cb0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
11cc0 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
11cd0 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
11ce0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
11cf0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
11d00 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
11d10 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
11d20 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
11d30 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
11d40 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
11d50 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
11d60 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
11d70 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
11d80 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
11d90 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
11da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
11db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
11dc0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
11dd0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
11de0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
11df0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
11e00 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
11e10 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
11e20 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
11e30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
11e40 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
11e50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11e60 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
11e70 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
11e80 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 7d  iCacheLevel++;.}
11e90 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
11ea0 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
11eb0 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
11ec0 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
11ed0 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
11ee0 65 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73  e previous N Pus
11ef0 68 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49  h operations.  I
11f00 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
11f10 65 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65  estore the cache
11f20 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65  .** to the state
11f30 20 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73   it was in N Pus
11f40 68 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64  hes ago..*/.void
11f50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11f60 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
11f70 73 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e  se, int N){.  in
11f80 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
11f90 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
11fa0 73 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61  sert( N>0 );.  a
11fb0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
11fc0 43 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b  CacheLevel>=N );
11fd0 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
11fe0 65 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 20 20 66  eLevel -= N;.  f
11ff0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12000 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12010 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12020 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12030 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
12040 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
12050 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
12060 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
12070 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
12080 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
12090 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
120a0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
120b0 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
120c0 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
120d0 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
120e0 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
120f0 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
12100 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
12110 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
12120 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
12130 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
12140 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
12150 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
12160 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
12170 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
12180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12190 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
121a0 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
121b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
121c0 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
121d0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
121e0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
121f0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
12200 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
12210 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
12220 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
12230 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
12240 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
12250 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12260 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
12270 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
12280 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
12290 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
122a0 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
122b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
122c0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
122d0 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
122e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
122f0 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
12300 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
12310 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
12320 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
12330 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
12340 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
12350 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
12360 72 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  r for this table
12370 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
12380 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12390 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
123a0 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
123b0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
123c0 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
123d0 64 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  d into this regi
123e0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
123f0 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
12400 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
12410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
12430 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
12440 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
12450 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
12460 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
12470 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
12480 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
12490 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
124a0 2c 20 69 54 61 62 43 75 72 2c 20 69 43 6f 6c 2c  , iTabCur, iCol,
124b0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
124c0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
124d0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
124e0 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
124f0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
12500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12510 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
12520 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
12530 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
12540 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
12550 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
12560 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
12570 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
12580 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
12590 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
125a0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
125b0 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
125c0 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
125d0 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
125e0 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
125f0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
12600 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
12610 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
12620 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
12630 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
12640 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
12650 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
12660 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
12670 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
12680 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
12690 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
126a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
126b0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
126c0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
126d0 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
126e0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
126f0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
12700 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
12710 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
12720 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
12730 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
12740 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
12750 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
12760 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
12770 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
12780 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
12790 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
127a0 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
127b0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
127c0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
127d0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
127e0 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
127f0 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
12800 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a  or OP_Column */.
12810 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
12820 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12830 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12840 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
12850 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
12860 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
12870 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12880 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12890 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
128a0 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
128b0 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
128c0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
128d0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
128e0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
128f0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
12900 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
12910 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
12920 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
12930 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
12940 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
12950 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
12960 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
12970 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
12980 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
12990 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
129a0 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
129b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
129c0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
129d0 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
129e0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
129f0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
12a00 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
12a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
12a20 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
12a30 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
12a40 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
12a50 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12a60 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
12a70 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
12a80 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
12a90 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
12aa0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12ab0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
12ac0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
12ad0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
12ae0 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20  if( p->iReg ){. 
12af0 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
12b00 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
12b10 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
12b20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
12b30 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
12b40 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
12b50 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
12b60 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
12b70 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
12b80 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
12b90 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
12ba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12bb0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
12bc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12bd0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
12be0 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
12bf0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
12c00 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
12c10 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
12c20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12c30 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
12c40 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
12c50 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
12c60 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
12c70 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
12c80 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
12c90 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
12ca0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12cb0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
12cc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12cd0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
12ce0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
12cf0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12d00 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
12d10 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
12d20 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
12d30 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
12d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12d50 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
12d60 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
12d70 69 54 6f 2c 20 6e 52 65 67 2d 31 29 3b 0a 20 20  iTo, nReg-1);.  
12d80 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12d90 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12da0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12db0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12dc0 20 20 69 6e 74 20 78 20 3d 20 70 2d 3e 69 52 65    int x = p->iRe
12dd0 67 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46  g;.    if( x>=iF
12de0 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e  rom && x<iFrom+n
12df0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
12e00 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f  iReg += iTo-iFro
12e10 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  m;.    }.  }.}..
12e20 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
12e30 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
12e40 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
12e50 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
12e60 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12e70 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
12e80 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
12e90 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
12ea0 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
12eb0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
12ec0 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
12ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
12ee0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
12ef0 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
12f00 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
12f10 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
12f20 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
12f30 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
12f40 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
12f50 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
12f60 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
12f70 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
12f80 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
12f90 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
12fa0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
12fb0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
12fc0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
12fd0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
12fe0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
12ff0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
13000 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
13010 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
13020 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
13030 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
13040 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
13050 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
13060 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a  AGE_TEST */../*.
13070 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13080 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
13090 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
130a0 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
130b0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
130c0 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
130d0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
130e0 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
130f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
13100 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
13110 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
13120 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
13130 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
13140 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
13150 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
13160 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
13170 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
13180 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
13190 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
131a0 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
131b0 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
131c0 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
131d0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
131e0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
131f0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
13200 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
13210 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
13220 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
13230 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
13240 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
13250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13260 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
13270 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
13280 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13290 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
132a0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
132b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
132e0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
132f0 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
13300 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
13310 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
13320 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
13330 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
13340 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
13350 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
13360 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
13370 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
13380 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
13390 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
133a0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
133b0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
133c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
133d0 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
133e0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
133f0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
13400 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13410 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
13420 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
13430 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  nnection */..  a
13440 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
13450 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
13460 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
13470 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
13480 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13490 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
134a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
134b0 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
134c0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
134d0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
134e0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
134f0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
13500 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
13510 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
13520 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
13530 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
13540 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
13550 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
13560 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
13570 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
13580 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
13590 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
135a0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
135b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
135c0 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
135d0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
135e0 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
135f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13600 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
13610 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
13620 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
13630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13640 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
13650 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
13660 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20  dxPTab,.        
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
13690 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
136a0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
136b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
136c0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
136d0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
136e0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
136f0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
13700 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
13710 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13720 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
13730 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c       /* This onl
13740 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
13750 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73  oding check cons
13760 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20  traints */.     
13770 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
13780 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20  e->ckBase>0 );. 
13790 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
137a0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20  Expr->iColumn + 
137b0 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a  pParse->ckBase;.
137c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
137d0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
137e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
137f0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
13800 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13830 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
13840 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
13850 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
13880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13890 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
138a0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
138b0 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
138c0 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
138d0 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
138e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
138f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13900 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
13910 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
13920 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
13930 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
13940 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
13950 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
13960 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
13970 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
13980 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
13990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
139a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
139b0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
139c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
139d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
139e0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
139f0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
13a00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13a10 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
13a20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72  target, 0, pExpr
13a30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
13a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13a50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
13a60 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
13a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13a80 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
13a90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
13aa0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
13ab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
13ac0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
13ad0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
13ae0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
13af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
13b00 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
13b10 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
13b20 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
13b30 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
13b40 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
13b50 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
13b60 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
13b70 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
13b80 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13ba0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
13bb0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
13bc0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
13bd0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
13be0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13bf0 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
13c00 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
13c10 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
13c20 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
13c30 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
13c40 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
13c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13c60 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
13c70 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
13c80 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
13c90 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
13ca0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
13cb0 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
13cc0 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
13cd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13ce0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13cf0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
13d00 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13d10 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
13d20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13d30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
13d40 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
13d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13d60 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
13d70 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
13d80 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
13d90 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
13da0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
13db0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13dc0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
13dd0 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
13de0 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
13df0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
13e00 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
13e10 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
13e20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
13e30 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
13e40 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
13e50 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
13e60 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
13e70 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
13e80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13e90 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
13ea0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
13eb0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
13ec0 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
13ed0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13ee0 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69  TK_AS: {.      i
13ef0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
13f00 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
13f10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13f20 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
13f30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13f50 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
13f60 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
13f70 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
13f80 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
13f90 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
13fa0 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
13fb0 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20  t aff, to_op;.  
13fc0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
13fd0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
13fe0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
13ff0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
14000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14010 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14020 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14030 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66  ue) );.      aff
14040 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
14050 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
14060 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74  zToken);.      t
14070 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
14080 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
14090 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
140a0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
140b0 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
140c0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
140d0 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
140e0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
140f0 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
14100 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14110 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
14120 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14130 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
14140 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14150 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
14160 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14170 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
14180 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
14190 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
141a0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
141b0 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
141c0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
141d0 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
141e0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
141f0 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20  =OP_ToText );.  
14200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14210 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29  _op==OP_ToBlob )
14220 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14230 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
14240 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74  meric );.      t
14250 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14260 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20  OP_ToInt );.    
14270 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14280 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a  p==OP_ToReal );.
14290 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
142a0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
142b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
142c0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
142d0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
142e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
142f0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
14300 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14310 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f  dbeAddOp1(v, to_
14320 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
14330 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
14340 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
14350 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
14360 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
14370 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14380 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14390 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
143a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
143b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
143c0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
143d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
143e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
143f0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
14400 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
14410 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
14420 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
14430 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14440 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
14450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14460 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
14470 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
14480 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
14490 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
144a0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
144b0 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
144c0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
144d0 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
144e0 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Ne );.      test
144f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
14500 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14510 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
14520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14530 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
14540 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14550 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
14560 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14570 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
14580 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
14590 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
145a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
145b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
145c0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
145d0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
145e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
145f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14600 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
14610 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
14620 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14630 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14640 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14660 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
14670 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
14680 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
14690 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
146a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
146b0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
146c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
146d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
146e0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
146f0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
14700 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14710 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
14720 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
14730 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
14740 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14750 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14760 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14770 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
14780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14790 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
147a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
147b0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
147c0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
147d0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
147e0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
147f0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
14800 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
14810 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
14830 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
14840 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
14850 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
14860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14870 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
14880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
14890 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
148a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
148b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
148c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
148d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
148e0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
148f0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
14900 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
14910 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
14920 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
14930 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
14940 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
14950 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
14960 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
14970 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
14980 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
14990 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
149a0 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
149b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149c0 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
149d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
149e0 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
149f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14a00 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
14a10 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
14a20 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
14a30 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
14a40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
14a50 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
14a60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14a70 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
14a80 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
14a90 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
14aa0 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
14ab0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
14ac0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
14ad0 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
14ae0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
14af0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
14b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14b10 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
14b20 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
14b30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
14b40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14b50 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
14b60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14b70 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
14b80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14b90 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
14ba0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14bb0 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
14bc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14bd0 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
14be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14bf0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
14c00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14c10 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
14c20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14c30 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
14c40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14c50 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
14c60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14c70 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
14c80 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14c90 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14ca0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14cb0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14cc0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
14cd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14ce0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
14cf0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
14d00 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
14d10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14d20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
14d30 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
14d40 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14d50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14d60 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14d70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14d80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14d90 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
14da0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
14db0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
14dd0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
14de0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
14df0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
14e00 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
14e10 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
14e20 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
14e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
14e40 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
14e50 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
14e60 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
14e70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14e80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14e90 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14ea0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
14eb0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
14ec0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
14ed0 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
14ee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ef0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
14f00 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14f10 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14f40 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
14f50 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
14f60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
14f70 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14f80 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14f90 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
14fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14fb0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
14fc0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
14fd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
14fe0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15000 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
15010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15020 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
15030 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
15040 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
15050 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
15060 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
15070 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
15080 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
15090 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
150a0 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
150b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150c0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
150d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
150e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
150f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15100 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15120 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15130 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
15140 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
15150 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
15160 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
15170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15180 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
15190 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
151a0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
151b0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
151c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
151d0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
151e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
151f0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
15200 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
15210 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15220 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
15230 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15240 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
15250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15270 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
15280 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15290 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
152a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
152b0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
152c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
152d0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
152e0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
152f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15300 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
15310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15320 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
15330 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
15340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15350 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15370 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15380 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
15390 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
153a0 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
153b0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
153c0 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
153d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
153e0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
153f0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15400 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
15410 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15420 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
15430 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
15440 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
15450 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
15460 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
15470 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
15480 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
15490 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
154a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
154b0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
154c0 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
154d0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
154e0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
154f0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
15500 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
15510 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
15520 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
15530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15540 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
15550 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
15560 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
15570 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
15580 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
15590 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
155a0 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
155b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
155c0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e  ength of the fun
155d0 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79  ction name in by
155e0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  tes */.      con
155f0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
15600 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
15610 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
15620 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
15630 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b  = 0;     /* Mask
15640 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
15650 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  uments that are 
15660 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20  constant */.    
15670 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
15680 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15690 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
156a0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
156b0 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b);      /* The 
156c0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73  text encoding us
156d0 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ed by this datab
156e0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  ase */.      Col
156f0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
15700 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69      /* A collati
15710 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  ng sequence */..
15720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15730 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15740 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
15750 63 74 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ct) );.      tes
15760 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
15770 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
15780 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15790 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
157a0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
157b0 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
157c0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
157d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
157e0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
157f0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
15800 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
15810 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
15820 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
15830 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
15840 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
15850 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
15860 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
15870 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
15880 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
15890 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
158a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
158b0 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
158c0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
158d0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
158e0 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
158f0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
15900 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
15910 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15920 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15930 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
15940 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49  %.*s()", nId, zI
15950 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
15960 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
15970 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
15980 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
15990 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
159a0 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
159b0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
159c0 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
159d0 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
159e0 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 61 74  necessary evalat
159f0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
15a00 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
15a10 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
15a20 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
15a30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
15a40 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
15a50 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
15a60 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
15a70 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
15a80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15a90 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
15aa0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
15ab0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
15ac0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15ad0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
15ae0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
15af0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
15b00 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
15b10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15b20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15b30 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
15b40 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
15b50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15b60 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
15b70 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
15b80 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15b90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15ba0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
15bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15bc0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15bd0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
15be0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15c00 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
15c10 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
15c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15c30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15c40 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
15c50 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15c60 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
15c70 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
15c80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15c90 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
15ca0 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 0a 20  arse, nFarg);.. 
15cb0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
15cc0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
15cd0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
15ce0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
15cf0 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
15d00 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
15d10 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
15d20 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
15d30 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
15d40 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
15d50 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
15d60 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
15d70 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
15d80 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
15d90 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
15da0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15db0 69 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73  if( (pDef->flags
15dc0 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
15dd0 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
15de0 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
15df0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
15e00 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
15e10 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
15e20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
15e30 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
15e40 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
15e50 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
15e60 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
15e70 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
15e80 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
15e90 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
15ea0 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
15eb0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
15ec0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15ed0 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
15ee0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
15ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
15f00 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
15f10 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
15f20 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
15f30 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
15f40 65 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 3d 3d  e( pDef->flags==
15f50 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
15f60 54 48 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TH );.          
15f70 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45    pFarg->a[0].pE
15f80 78 70 72 2d 3e 6f 70 32 20 3d 20 70 44 65 66 2d  xpr->op2 = pDef-
15f90 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
15fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
15fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15fc0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
15fd0 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
15fe0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
15ff0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
16000 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
16010 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
16020 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
16030 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16040 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
16050 3b 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65  ;   /* Ticket 2e
16060 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
16070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16080 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
16090 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
160a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
160b0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
160c0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
160d0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
160e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
160f0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
16100 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
16110 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
16120 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
16130 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
16140 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
16150 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
16160 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
16170 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
16180 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
16190 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
161a0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
161b0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
161c0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
161d0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
161e0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
161f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
16200 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
16210 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
16220 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
16230 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
16240 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
16250 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
16260 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16270 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
16280 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
16290 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
162a0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
162b0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
162c0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
162d0 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
162e0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
162f0 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
16300 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
16310 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
16320 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
16330 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
16340 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
16350 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
16360 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
16370 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
16380 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
16390 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
163a0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
163b0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
163c0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
163d0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
163e0 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
163f0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
16400 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
16410 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
16420 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
16430 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
16440 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16450 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16460 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
16470 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
16480 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
16490 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
164a0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
164b0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
164c0 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
164d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
164e0 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
164f0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
16500 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
16510 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
16520 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
16530 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
16540 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
16550 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
16560 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16570 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
16580 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
16590 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
165a0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
165b0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
165c0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
165d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
165e0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
165f0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
16600 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
16610 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
16620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16630 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
16640 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
16650 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
16680 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
16690 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
166a0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
166b0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
166c0 20 6e 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   nFarg ){.      
166d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
166e0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
166f0 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
16700 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
16710 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
16720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16730 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
16740 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
16750 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
16760 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16770 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
16780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16790 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
167a0 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
167b0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
167c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
167d0 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
167e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
167f0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
16800 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
16810 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
16820 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16830 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
16840 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
16850 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16880 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
16890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
168a0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
168b0 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
168c0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
168d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
168e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
168f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
16900 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
16910 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16920 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
16930 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
16940 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16950 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
16960 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
16970 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16980 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
16990 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
169a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
169b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
169c0 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
169d0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
169e0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
169f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
16a00 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
16a10 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
16a20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
16a30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
16a40 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
16a50 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
16a60 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
16a70 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
16a80 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
16a90 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
16aa0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
16ab0 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
16ac0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
16ad0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
16ae0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
16af0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
16b00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16b10 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
16b20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
16b30 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
16b40 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
16b50 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72  >pExpr;..      r
16b60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
16b70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16b80 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
16b90 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
16ba0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16bb0 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
16bc0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
16bd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16be0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
16bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16c00 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16c10 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65    r3 = sqlite3Ge
16c20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16c30 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c  ;.      r4 = sql
16c40 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16c50 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f  Parse);.      co
16c60 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
16c70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
16c80 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20   OP_Ge,.        
16c90 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
16ca0 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r3, SQLITE_STO
16cb0 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49  REP2);.      pLI
16cc0 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
16cd0 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
16ce0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
16cf0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16d00 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
16d10 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
16d20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16d30 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
16d40 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
16d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16d60 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
16d70 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
16d80 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
16d90 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
16da0 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
16db0 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
16dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16dd0 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33  p3(v, OP_And, r3
16de0 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r4, target);. 
16df0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16e00 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16e10 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71  e, r3);.      sq
16e20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16e30 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b  Reg(pParse, r4);
16e40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16e50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16e60 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61  COLLATE: .    ca
16e70 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
16e80 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
16e90 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
16ea0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
16eb0 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
16ec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16ed0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
16ee0 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20  K_TRIGGER: {.   
16ef0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63     /* If the opc
16f00 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45  ode is TK_TRIGGE
16f10 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  R, then the expr
16f20 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65  ession is a refe
16f30 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  rence.      ** t
16f40 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  o a column in th
16f50 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  e new.* or old.*
16f60 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61   pseudo-tables a
16f70 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20  vailable to.    
16f80 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f    ** trigger pro
16f90 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63  grams. In this c
16fa0 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20  ase Expr.iTable 
16fb0 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
16fc0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77  the.      ** new
16fd0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
16fe0 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c   or 0 for the ol
16ff0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
17000 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20  . Expr.iColumn. 
17010 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
17020 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  o the column of 
17030 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
17040 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20   to read, or to 
17050 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  -1 to.      ** r
17060 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69  ead the rowid fi
17070 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eld..      **.  
17080 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65      ** The expre
17090 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ssion is impleme
170a0 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50  nted using an OP
170b0 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54  _Param opcode. T
170c0 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70  he p1.      ** p
170d0 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20  arameter is set 
170e0 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e  to 0 for an old.
170f0 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c  rowid reference,
17100 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20   or to (i+1).   
17110 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e     ** to referen
17120 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d  ce another colum
17130 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70  n of the old.* p
17140 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65  seudo-table, whe
17150 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69  re .      ** i i
17160 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
17170 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61  he column. For a
17180 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72   new.rowid refer
17190 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20  ence, p1 is.    
171a0 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31    ** set to (n+1
171b0 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68  ), where n is th
171c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
171d0 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75  mns in each pseu
171e0 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  do-table..      
171f0 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e  ** For a referen
17200 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ce to any other 
17210 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
17220 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
17230 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73  , p1.      ** is
17240 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c   set to (n+2+i),
17250 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61   where n and i a
17260 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72  re as defined pr
17270 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20  eviously. For.  
17280 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20      ** example, 
17290 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  if the table on 
172a0 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61  which triggers a
172b0 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69  re being fired i
172c0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61  s.      ** decla
172d0 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  red as:.      **
172e0 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41  .      **   CREA
172f0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
17300 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  );.      **.    
17310 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20    ** Then p1 is 
17320 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
17330 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
17340 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
17350 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f  0   ->    old.ro
17360 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20  wid     p1==3   
17370 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a  ->    new.rowid.
17380 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31        **   p1==1
17390 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20     ->    old.a  
173a0 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d         p1==4   -
173b0 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20  >    new.a.     
173c0 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e   **   p1==2   ->
173d0 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20      old.b       
173e0 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20    p1==5   ->    
173f0 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20  new.b       .   
17400 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
17410 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
17420 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  >pTab;.      int
17430 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61   p1 = pExpr->iTa
17440 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f  ble * (pTab->nCo
17450 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72  l+1) + 1 + pExpr
17460 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20  ->iColumn;..    
17470 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17480 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45  >iTable==0 || pE
17490 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29  xpr->iTable==1 )
174a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
174b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
174c0 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  -1 && pExpr->iCo
174d0 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
174e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
174f0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
17500 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
17510 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b  !=pTab->iPKey );
17520 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17530 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62  1>=0 && p1<(pTab
17540 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a  ->nCol*2+2) );..
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17560 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61  eAddOp2(v, OP_Pa
17570 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29  ram, p1, target)
17580 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
17590 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d  ent((v, "%s.%s -
175a0 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20  > $%d",.        
175b0 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f  (pExpr->iTable ?
175c0 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c   "new" : "old"),
175d0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
175e0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f  >iColumn<0 ? "ro
175f0 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54  wid" : pExpr->pT
17600 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
17610 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c  iColumn].zName),
17620 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a  .        target.
17630 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64        ));..#ifnd
17640 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
17650 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
17660 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
17670 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66  lumn has REAL af
17680 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63  finity, it may c
17690 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
176a0 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a  ed as an.      *
176b0 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f  * integer. Use O
176c0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74  P_RealAffinity t
176d0 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
176e0 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20  s really real.  
176f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
17700 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
17710 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
17720 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
17730 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
17740 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
17750 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17770 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
17780 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
17790 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
177a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
177b0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
177c0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
177d0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
177e0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
177f0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
17800 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
17810 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
17820 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
17830 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
17840 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
17850 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
17860 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
17870 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
17880 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
17890 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
178a0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
178b0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
178c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
178d0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
178e0 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
178f0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
17900 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
17910 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
17920 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
17930 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
17940 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
17950 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
17960 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
17970 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
17980 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
17990 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
179a0 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
179b0 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
179c0 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
179d0 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
179e0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
179f0 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
17a00 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
17a10 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
17a20 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
17a30 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
17a40 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
17a50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17a60 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
17a70 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
17a80 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
17a90 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
17aa0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
17ab0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
17ac0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
17ad0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
17ae0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
17af0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
17b00 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
17b10 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
17b20 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
17b30 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
17b60 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
17b70 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
17b80 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
17bb0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
17bc0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
17bd0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
17c00 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
17c10 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17c40 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
17c50 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
17c80 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
17c90 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17ca0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
17cb0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
17cc0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
17cd0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
17ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17cf0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
17d00 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
17d10 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58       Expr cacheX
17d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17d30 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64         /* Cached
17d40 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f   expression X */
17d50 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17d80 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
17d90 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
17da0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
17db0 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
17dc0 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
17dd0 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
17de0 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
17df0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
17e00 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
17e10 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
17e20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17e30 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17e40 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
17e50 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
17e60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17e70 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ((pExpr->x.pList
17e80 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
17e90 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
17ea0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
17eb0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
17ec0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
17ed0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
17ee0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
17ef0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
17f00 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
17f10 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
17f20 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
17f30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17f40 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
17f50 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
17f60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
17f70 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
17f80 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
17f90 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
17fa0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17fb0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  e( pX->op==TK_RE
17fc0 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
17fd0 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20    cacheX.iTable 
17fe0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17ff0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
18000 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18010 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18020 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
18030 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70         cacheX.op
18040 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
18050 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
18060 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
18070 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
18080 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b  pLeft = &cacheX;
18090 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
180a0 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
180b0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62       /* Ticket b
180c0 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65  351d95f9cd5ef17e
180d0 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31  9d9dbae18f5ca861
180e0 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20  1190001:.       
180f0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e   ** The value in
18100 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20   regFree1 might 
18110 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74  get SCopy-ed int
18120 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c  o the file resul
18130 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  t..        ** So
18140 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18150 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67  the regFree1 reg
18160 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75  ister is not reu
18170 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20  sed for other.  
18180 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65        ** purpose
18190 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  s and possibly o
181a0 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
181b0 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
181c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
181d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
181e0 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
181f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18200 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
18210 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
18220 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
18230 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
18240 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
18250 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
18260 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
18270 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
18280 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
18290 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
182a0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
182b0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
182c0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
182d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
182e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
182f0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
18300 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
18310 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
18320 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
18330 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
18340 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
18350 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18360 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
18370 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
18380 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
18390 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
183a0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
183b0 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
183c0 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ER );.        sq
183d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
183e0 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
183f0 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
18400 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
18410 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18420 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
18430 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
18440 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18450 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
18460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18470 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18480 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
18490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
184a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
184b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
184c0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
184d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
184e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
184f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18500 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a  Right, target);.
18510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18520 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
18530 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  se, 1);.      }e
18540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
18550 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18560 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
18570 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
18580 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
18590 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
185a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
185b0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
185c0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
185d0 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
185e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
185f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18600 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
18610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18620 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18630 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
18640 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
18650 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
18660 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
18670 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
18680 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
18690 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
186a0 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
186b0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
186c0 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
186d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
186e0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
186f0 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
18700 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
18710 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
18720 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18730 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18750 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
18760 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
18770 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
18780 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
18790 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
187a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
187b0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
187c0 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
187d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
187e0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
187f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
18800 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18810 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18820 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
18830 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
18840 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
18850 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
18860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18870 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
18880 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
18890 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
188a0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
188b0 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  en,0);.      }el
188c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
188d0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
188e0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
188f0 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72  >affinity, pExpr
18900 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
18910 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
18920 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
18930 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
18940 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18950 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
18960 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
18970 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18980 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
18990 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
189a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
189b0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
189c0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
189d0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
189e0 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
189f0 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
18a00 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
18a10 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
18a20 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
18a30 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
18a40 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
18a50 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
18a60 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
18a70 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
18a80 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
18a90 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
18aa0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
18ab0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
18ac0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
18ad0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
18ae0 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  o zero..*/.int s
18af0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18b00 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
18b10 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
18b20 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
18b30 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
18b40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18b50 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69  .  int r2 = sqli
18b60 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18b70 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
18b80 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d   r1);.  if( r2==
18b90 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  r1 ){.    *pReg 
18ba0 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = r1;.  }else{. 
18bb0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
18bc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18bd0 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20   r1);.    *pReg 
18be0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18bf0 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
18c00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
18c10 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
18c20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
18c30 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
18c40 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
18c50 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
18c60 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
18c70 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
18c80 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
18c90 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e  er target..*/.in
18ca0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
18cb0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
18cc0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
18cd0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
18ce0 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
18cf0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
18d00 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
18d10 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
18d20 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
18d30 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
18d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18d50 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
18d60 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
18d70 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
18d80 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
18d90 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
18da0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
18db0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18dc0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
18dd0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
18de0 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  be || pParse->db
18df0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18e00 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
18e10 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
18e20 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
18e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18e40 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
18e50 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
18e60 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
18e70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18e80 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  target;.}../*.**
18e90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18ea0 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
18eb0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
18ec0 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
18ed0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
18ee0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
18ef0 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
18f00 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
18f10 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
18f20 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
18f30 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
18f40 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
18f50 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
18f60 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
18f70 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
18f80 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
18f90 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
18fa0 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
18fb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18fc0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
18fd0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
18fe0 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
18ff0 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
19000 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
19010 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
19020 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
19030 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
19040 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
19050 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
19060 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
19070 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
19080 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
19090 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
190a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
190b0 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20  nReg;.  inReg = 
190c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
190d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
190e0 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
190f0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
19100 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
19110 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 65  is called for te
19120 72 6d 73 20 74 6f 20 49 4e 53 45 52 54 20 6f 72  rms to INSERT or
19130 20 55 50 44 41 54 45 2e 20 20 41 6e 64 20 74 68   UPDATE.  And th
19140 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65  e only.  ** othe
19150 72 20 70 6c 61 63 65 20 77 68 65 72 65 20 65 78  r place where ex
19160 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65  pressions can be
19170 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
19180 54 4b 5f 52 45 47 49 53 54 45 52 20 69 73 0a 20  TK_REGISTER is. 
19190 20 2a 2a 20 69 6e 20 57 48 45 52 45 20 63 6c 61   ** in WHERE cla
191a0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
191b0 20 53 6f 20 61 73 20 63 75 72 72 65 6e 74 6c 79   So as currently
191c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 74 68   implemented, th
191d0 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e 6f 20 77  ere is.  ** no w
191e0 61 79 20 66 6f 72 20 61 20 54 4b 5f 52 45 47 49  ay for a TK_REGI
191f0 53 54 45 52 20 74 6f 20 65 78 69 73 74 20 68 65  STER to exist he
19200 72 65 2e 20 20 42 75 74 20 69 74 20 73 65 65 6d  re.  But it seem
19210 73 20 70 72 75 64 65 6e 74 20 74 6f 0a 20 20 2a  s prudent to.  *
19220 2a 20 6b 65 65 70 20 74 68 65 20 41 4c 57 41 59  * keep the ALWAY
19230 53 28 29 20 69 6e 20 63 61 73 65 20 74 68 65 20  S() in case the 
19240 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
19250 20 63 68 61 6e 67 65 20 77 69 74 68 20 66 75 74   change with fut
19260 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  ure.  ** modific
19270 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68 61 6e 63  ations or enhanc
19280 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
19290 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 6f   ALWAYS(pExpr->o
192a0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20  p!=TK_REGISTER) 
192b0 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
192c0 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
192d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
192e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
192f0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
19300 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
19310 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
19320 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  = iMem;.    pExp
19330 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e  r->op2 = pExpr->
19340 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  op;.    pExpr->o
19350 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
19360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e  .  }.  return in
19370 52 65 67 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Reg;.}..#if defi
19380 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19390 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
193a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
193b0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
193c0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
193d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
193e0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
193f0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 56 64  e3ExplainExpr(Vd
19400 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a  be *pOut, Expr *
19410 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70  pExpr){.  int op
19420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19430 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
19440 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
19450 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19460 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  BinOp = 0;   /* 
19470 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20  Binary operator 
19480 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
19490 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f  *zUniOp = 0;   /
194a0 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72  * Unary operator
194b0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
194c0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
194d0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
194e0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
194f0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
19500 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
19510 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
19520 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19530 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19540 75 74 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22  ut, "AGG{%d:%d}"
19550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ,.            pE
19560 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
19570 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19590 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
195a0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
195b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
195c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
195d0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
195e0 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
195f0 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
19600 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
19610 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19620 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29  Out, "COLUMN(%d)
19630 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ", pExpr->iColum
19640 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
19650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19660 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
19670 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20  ut, "{%d:%d}",. 
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
196a0 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
196b0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
196c0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
196d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
196e0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
196f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
19700 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
19710 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
19720 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
19730 74 66 28 70 4f 75 74 2c 20 22 25 64 22 2c 20 70  tf(pOut, "%d", p
19740 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
19750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19760 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19770 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
19780 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%s", pExpr->u.
19790 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
197a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
197b0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
197c0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
197d0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
197e0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
197f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
19800 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22  Printf(pOut,"%s"
19810 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
19820 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
19830 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19840 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
19850 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
19860 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19870 4f 75 74 2c 22 25 51 22 2c 20 70 45 78 70 72 2d  Out,"%Q", pExpr-
19880 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
198a0 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
198b0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
198c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
198d0 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
198e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
198f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19900 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
19910 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
19920 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
19930 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
19940 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  Out,"%s", pExpr-
19950 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
19960 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19970 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
19980 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
19990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
199a0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 56  inPrintf(pOut,"V
199b0 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c  ARIABLE(%s,%d)",
199c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
199d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
199e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78  r->u.zToken, pEx
199f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
19a00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19a10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
19a20 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
19a30 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
19a40 6e 74 66 28 70 4f 75 74 2c 22 52 45 47 49 53 54  ntf(pOut,"REGIST
19a50 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  ER(%d)", pExpr->
19a60 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
19a70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19a80 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
19a90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
19aa0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
19ab0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
19ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19ad0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19ae0 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
19af0 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
19b00 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
19b10 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
19b20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
19b30 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ken) */.      co
19b40 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  nst char *zAff =
19b50 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77   "unk";.      sw
19b60 69 74 63 68 28 20 73 71 6c 69 74 65 33 41 66 66  itch( sqlite3Aff
19b70 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
19b80 3e 75 2e 7a 54 6f 6b 65 6e 29 20 29 7b 0a 20 20  >u.zToken) ){.  
19b90 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
19ba0 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 7a  E_AFF_TEXT:    z
19bb0 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20 20 20  Aff = "TEXT";   
19bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19bd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
19be0 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d  _NONE:    zAff =
19bf0 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62 72 65   "NONE";     bre
19c00 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
19c10 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
19c20 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d  RIC: zAff = "NUM
19c30 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ERIC";  break;. 
19c40 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
19c50 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20  TE_AFF_INTEGER: 
19c60 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45 52 22  zAff = "INTEGER"
19c70 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
19c80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
19c90 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66 66 20  F_REAL:    zAff 
19ca0 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20 62 72  = "REAL";     br
19cb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19cc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
19cd0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43  nPrintf(pOut, "C
19ce0 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b  AST-%s(", zAff);
19cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19d00 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
19d10 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
19d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
19d30 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
19d40 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
19d50 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
19d60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
19d70 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
19d80 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_LT:      zBin
19d90 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62  Op = "LT";     b
19da0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
19db0 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_LE:      zBinO
19dc0 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72  p = "LE";     br
19dd0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
19de0 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _GT:      zBinOp
19df0 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72 65   = "GT";     bre
19e00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
19e10 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  GE:      zBinOp 
19e20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72 65 61  = "GE";     brea
19e30 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
19e40 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
19e50 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "NE";     break
19e60 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
19e70 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
19e80 22 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "EQ";     break;
19e90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
19ea0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
19eb0 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IS";     break;.
19ec0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
19ed0 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49  T:   zBinOp = "I
19ee0 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SNOT";  break;. 
19ef0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
19f00 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e      zBinOp = "AN
19f10 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
19f20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
19f30 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22     zBinOp = "OR"
19f40 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
19f50 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
19f60 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22    zBinOp = "ADD"
19f70 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
19f80 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
19f90 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b   zBinOp = "MUL";
19fa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19fb0 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20  ase TK_MINUS:   
19fc0 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20  zBinOp = "SUB"; 
19fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19fe0 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
19ff0 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20  BinOp = "REM";  
1a000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1a010 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42  e TK_BITAND:  zB
1a020 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b  inOp = "BITAND";
1a030 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1a040 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69   TK_BITOR:   zBi
1a050 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  nOp = "BITOR";  
1a060 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1a070 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e  TK_SLASH:   zBin
1a080 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62  Op = "DIV";    b
1a090 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1a0a0 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_LSHIFT:  zBinO
1a0b0 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72  p = "LSHIFT"; br
1a0c0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1a0d0 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70  _RSHIFT:  zBinOp
1a0e0 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72 65   = "RSHIFT"; bre
1a0f0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1a100 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20  CONCAT:  zBinOp 
1a110 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61  = "CONCAT"; brea
1a120 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
1a130 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20  UMINUS:  zUniOp 
1a140 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61  = "UMINUS"; brea
1a150 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
1a160 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d  PLUS:   zUniOp =
1a170 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b   "UPLUS";  break
1a180 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1a190 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  TNOT:  zUniOp = 
1a1a0 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b  "BITNOT"; break;
1a1b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1a1c0 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  :     zUniOp = "
1a1d0 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NOT";    break;.
1a1e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1a1f0 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49  LL:  zUniOp = "I
1a200 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20  SNULL"; break;. 
1a210 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1a220 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f  LL: zUniOp = "NO
1a230 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
1a240 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1a250 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
1a260 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
1a270 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
1a280 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1a290 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
1a2a0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1a2b0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1a2c0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ents */.      if
1a2d0 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
1a2e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
1a2f0 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
1a300 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
1a310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a320 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
1a330 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
1a340 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f     }.      if( o
1a350 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
1a360 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ON ){.        sq
1a370 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a380 74 66 28 70 4f 75 74 2c 20 22 41 47 47 5f 46 55  tf(pOut, "AGG_FU
1a390 4e 43 54 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20  NCTION%d:%s(",. 
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1a3c0 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75  r->op2, pExpr->u
1a3d0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1a3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1a3f0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a400 6e 74 66 28 70 4f 75 74 2c 20 22 46 55 4e 43 54  ntf(pOut, "FUNCT
1a410 49 4f 4e 3a 25 73 28 22 2c 20 70 45 78 70 72 2d  ION:%s(", pExpr-
1a420 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1a430 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
1a440 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
1a450 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1a460 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 46 61 72  rList(pOut, pFar
1a470 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1a480 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1a490 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
1a4a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a4b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1a4c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a4d0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
1a4e0 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73  XISTS: {.      s
1a4f0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a500 6e 74 66 28 70 4f 75 74 2c 20 22 45 58 49 53 54  ntf(pOut, "EXIST
1a510 53 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  S(");.      sqli
1a520 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1a530 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1a540 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1a550 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1a560 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a  intf(pOut,")");.
1a570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a580 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
1a590 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73  ELECT: {.      s
1a5a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1a5b0 6e 74 66 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a  ntf(pOut, "(");.
1a5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a5d0 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c  lainSelect(pOut,
1a5e0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1a5f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a600 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1a610 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1a620 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a630 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1a640 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a650 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1a660 20 22 49 4e 28 22 29 3b 0a 20 20 20 20 20 20 73   "IN(");.      s
1a670 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1a680 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1a690 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1a6a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1a6b0 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1a6c0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1a6d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1a6e0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1a6f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a700 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
1a710 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1a720 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ect);.      }els
1a730 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1a740 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1a750 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1a760 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  .pList);.      }
1a770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a780 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1a790 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1a7a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1a7b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a7c0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
1a7d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
1a7e0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1a7f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1a800 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
1a810 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
1a820 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1a830 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
1a840 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
1a850 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
1a860 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
1a870 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
1a880 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
1a890 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
1a8a0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
1a8b0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
1a8c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
1a8d0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1a8e0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
1a8f0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
1a900 20 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78    Expr *pY = pEx
1a910 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1a920 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
1a930 78 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d  xpr *pZ = pExpr-
1a940 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
1a950 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
1a960 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1a970 28 70 4f 75 74 2c 20 22 42 45 54 57 45 45 4e 28  (pOut, "BETWEEN(
1a980 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1a990 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1a9a0 74 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 73 71  t, pX);.      sq
1a9b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1a9c0 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20  tf(pOut, ",");. 
1a9d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1a9e0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 59  ainExpr(pOut, pY
1a9f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1aa00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1aa10 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1aa20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1aa30 70 72 28 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20  pr(pOut, pZ);.  
1aa40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aa50 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1aa60 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1aa70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1aa80 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
1aa90 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
1aaa0 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
1aab0 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
1aac0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
1aad0 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
1aae0 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
1aaf0 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
1ab00 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
1ab10 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
1ab20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
1ab30 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
1ab40 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
1ab50 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
1ab60 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
1ab70 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
1ab80 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
1ab90 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1aba0 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
1abb0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
1abc0 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
1abd0 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
1abe0 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
1abf0 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
1ac00 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
1ac10 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
1ac20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ac30 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1ac40 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20   "%s(%d)", .    
1ac50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1ac60 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f  ble ? "NEW" : "O
1ac70 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  LD", pExpr->iCol
1ac80 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
1ac90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1aca0 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
1acb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1acc0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43  nPrintf(pOut, "C
1acd0 41 53 45 28 22 29 3b 0a 20 20 20 20 20 20 73 71  ASE(");.      sq
1ace0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1acf0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1ad00 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1ad10 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ad20 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  (pOut, ",");.   
1ad30 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ad40 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1ad50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
1ad60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ad70 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ad80 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1ad90 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
1ada0 45 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  E: {.      const
1adb0 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22   char *zType = "
1adc0 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74  unk";.      swit
1add0 63 68 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ch( pExpr->affin
1ade0 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ity ){.        c
1adf0 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a  ase OE_Rollback:
1ae00 20 20 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c     zType = "roll
1ae10 62 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20  back";  break;. 
1ae20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41         case OE_A
1ae30 62 6f 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65  bort:      zType
1ae40 20 3d 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20   = "abort";     
1ae50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1ae60 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20  ase OE_Fail:    
1ae70 20 20 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c     zType = "fail
1ae80 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
1ae90 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49         case OE_I
1aea0 67 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65  gnore:     zType
1aeb0 20 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20   = "ignore";    
1aec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1aed0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1aee0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1aef0 22 52 41 49 53 45 2d 25 73 28 25 73 29 22 2c 20  "RAISE-%s(%s)", 
1af00 7a 54 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e  zType, pExpr->u.
1af10 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1af20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1af30 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69  if.  }.  if( zBi
1af40 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nOp ){.    sqlit
1af50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1af60 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e  pOut,"%s(", zBin
1af70 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
1af80 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1af90 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1afa0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1afb0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1afc0 2c 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,");.    sqlite3
1afd0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1afe0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
1aff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b000 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b010 22 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ")");.  }else if
1b020 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20  ( zUniOp ){.    
1b030 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b040 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c  intf(pOut,"%s(",
1b050 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71   zUniOp);.    sq
1b060 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b070 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1b080 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
1b090 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b0a0 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a  Out,")");.  }.}.
1b0b0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1b0c0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1b0d0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f  TREE_EXPLAIN) */
1b0e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1b0f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1b100 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
1b110 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
1b120 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
1b130 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
1b140 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
1b150 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
1b160 61 69 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65  ainExprList(Vdbe
1b170 20 2a 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74   *pOut, ExprList
1b180 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1b190 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1b1a0 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
1b1b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1b1c0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b1d0 28 70 4f 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c  (pOut, "(empty-l
1b1e0 69 73 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75  ist)");.    retu
1b1f0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1b200 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
1b210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1b220 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1b230 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1b240 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1b250 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b260 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 66  ush(pOut);.    f
1b270 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1b280 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1b290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b2a0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1b2b0 69 74 65 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29  item[%d] = ", i)
1b2c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b2d0 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29  xplainPush(pOut)
1b2e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b2f0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1b300 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1b310 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
1b320 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75  e3ExplainPop(pOu
1b330 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c  t);.      if( i<
1b340 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
1b350 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b360 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29  3ExplainNL(pOut)
1b370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b380 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b390 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d  inPop(pOut);.  }
1b3a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b3b0 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
1b3c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1b3d0 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
1b3e0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
1b3f0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
1b400 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
1b410 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
1b420 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
1b430 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
1b440 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
1b450 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
1b460 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
1b470 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
1b480 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
1b490 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
1b4a0 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
1b4b0 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
1b4c0 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
1b4d0 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
1b4e0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1b4f0 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
1b500 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
1b510 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
1b520 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
1b530 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
1b540 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
1b550 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
1b560 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
1b570 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
1b580 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
1b590 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
1b5a0 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
1b5b0 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
1b5c0 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
1b5d0 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
1b5e0 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
1b5f0 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
1b600 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
1b610 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
1b620 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
1b630 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
1b640 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
1b650 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
1b660 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1b670 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
1b680 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
1b690 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
1b6a0 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
1b6b0 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
1b6c0 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
1b6d0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
1b6e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1b6f0 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
1b700 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
1b710 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
1b720 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
1b730 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
1b740 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
1b750 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
1b760 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
1b770 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
1b780 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
1b790 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
1b7a0 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
1b7b0 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
1b7c0 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
1b7d0 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
1b7e0 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
1b7f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
1b800 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
1b810 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
1b820 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
1b830 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
1b840 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
1b850 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
1b860 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1b870 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
1b880 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
1b890 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1b8a0 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
1b8b0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1b8c0 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
1b8d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b8e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
1b8f0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
1b900 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
1b910 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
1b920 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
1b930 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
1b940 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
1b950 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
1b960 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
1b970 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
1b980 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
1b990 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
1b9a0 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
1b9b0 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
1b9c0 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
1b9d0 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
1b9e0 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
1b9f0 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
1ba00 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
1ba10 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
1ba20 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
1ba30 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
1ba40 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ba50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
1ba60 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
1ba70 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65        if( p->pLe
1ba80 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
1ba90 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   || p->pLeft->op
1baa0 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
1bab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1bac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bad0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1bae0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1baf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bb00 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1bb10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
1bb20 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
1bb30 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1bb40 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
1bb50 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f  r.** factoring o
1bb60 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68  ut of a loop, th
1bb70 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
1bb80 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e  expression.** in
1bb90 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
1bba0 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78  d convert the ex
1bbb0 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
1bbc0 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65  TK_REGISTER.** e
1bbd0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
1bbe0 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e  atic int evalCon
1bbf0 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70  stExpr(Walker *p
1bc00 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
1bc10 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
1bc20 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1bc30 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63  >pParse;.  switc
1bc40 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1bc50 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
1bc60 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1bc70 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
1bc80 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1bc90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1bca0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
1bcb0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1bcc0 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1bcd0 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a  K_CONST_FUNC: {.
1bce0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67        /* The arg
1bcf0 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63  uments to a func
1bd00 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65  tion have a fixe
1bd10 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  d destination.. 
1bd20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65       ** Mark the
1bd30 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76  m this way to av
1bd40 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e  oid generated un
1bd50 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a  needed OP_SCopy.
1bd60 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
1bd70 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f  tions. .      */
1bd80 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1bd90 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
1bda0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1bdb0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1bdc0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1bdd0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1bde0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
1bdf0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1be00 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1be10 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1be20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1be30 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1be40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69  .        for(; i
1be50 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1be60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1be70 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e 70   ALWAYS(pItem->p
1be80 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e 70  Expr) ) pItem->p
1be90 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
1bea0 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
1beb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bed0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
1bee0 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
1bef0 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
1bf00 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
1bf10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1bf20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
1bf30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1bf40 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1bf50 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
1bf60 69 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c  if( r1!=r2 ) sql
1bf70 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1bf80 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1bf90 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
1bfa0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
1bfb0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
1bfc0 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78  EGISTER;.    pEx
1bfd0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b  pr->iTable = r2;
1bfe0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1bff0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
1c000 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76  ;.}../*.** Preev
1c020 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74 20  aluate constant 
1c030 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
1c040 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64 20  ithin pExpr and 
1c050 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1c060 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1c070 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70 72  s.  Modify pExpr
1c080 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
1c090 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 69  stant subexpresi
1c0a0 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52 45  ons.** are TK_RE
1c0b0 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20 74  GISTER opcodes t
1c0c0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1c0d0 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61 6c   precomputed val
1c0e0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
1c0f0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c100 6f 70 20 69 66 20 74 68 65 20 6a 75 6d 70 20 74  op if the jump t
1c110 6f 20 74 68 65 20 63 6f 6f 6b 69 65 2d 63 68 65  o the cookie-che
1c120 63 6b 20 63 6f 64 65 20 68 61 73 0a 2a 2a 20 61  ck code has.** a
1c130 6c 72 65 61 64 79 20 6f 63 63 75 72 2e 20 20 53  lready occur.  S
1c140 69 6e 63 65 20 74 68 65 20 63 6f 6f 6b 69 65 2d  ince the cookie-
1c150 63 68 65 63 6b 20 6a 75 6d 70 20 69 73 20 67 65  check jump is ge
1c160 6e 65 72 61 74 65 64 20 70 72 69 6f 72 20 74 6f  nerated prior to
1c170 0a 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65  .** any other se
1c180 72 69 6f 75 73 20 70 72 6f 63 65 73 73 69 6e 67  rious processing
1c190 2c 20 74 68 69 73 20 63 68 65 63 6b 20 65 6e 73  , this check ens
1c1a0 75 72 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ures that there 
1c1b0 69 73 20 6e 6f 0a 2a 2a 20 77 61 79 20 74 6f 20  is no.** way to 
1c1c0 61 63 63 69 64 65 6e 74 6c 79 20 62 79 70 61 73  accidently bypas
1c1d0 73 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 69  s the constant i
1c1e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 73 2e 0a  nitializations..
1c1f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c200 6e 65 20 69 73 20 61 6c 73 6f 20 61 20 6e 6f 2d  ne is also a no-
1c210 6f 70 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  op if the SQLITE
1c220 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20  _FactorOutConst 
1c230 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
1c240 69 73 20 64 69 73 61 62 6c 65 64 20 76 69 61 20  is disabled via 
1c250 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74  the sqlite3_test
1c260 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c270 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1c280 41 54 49 4f 4e 53 29 0a 2a 2a 20 69 6e 74 65 72  ATIONS).** inter
1c290 66 61 63 65 2e 20 20 54 68 69 73 20 61 6c 6c 6f  face.  This allo
1c2a0 77 73 20 74 65 73 74 20 6c 6f 67 69 63 20 74 6f  ws test logic to
1c2b0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1c2c0 20 73 61 6d 65 20 61 6e 73 77 65 72 20 69 73 0a   same answer is.
1c2d0 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 20  ** obtained for 
1c2e0 71 75 65 72 69 65 73 20 72 65 67 61 72 64 6c 65  queries regardle
1c2f0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
1c300 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73 20 61   not constants a
1c310 72 65 0a 2a 2a 20 70 72 65 63 6f 6d 70 75 74 65  re.** precompute
1c320 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73  d into registers
1c330 20 6f 72 20 69 66 20 74 68 65 79 20 61 72 65 20   or if they are 
1c340 69 6e 73 65 72 74 65 64 20 69 6e 2d 6c 69 6e 65  inserted in-line
1c350 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c360 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e  3ExprCodeConstan
1c370 74 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ts(Parse *pParse
1c380 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
1c390 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 66    Walker w;.  if
1c3a0 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
1c3b0 47 6f 74 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Goto ) return;. 
1c3c0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1c3d0 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
1c3e0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 46 61 63  ->db, SQLITE_Fac
1c3f0 74 6f 72 4f 75 74 43 6f 6e 73 74 29 20 29 20 72  torOutConst) ) r
1c400 65 74 75 72 6e 3b 0a 20 20 77 2e 78 45 78 70 72  eturn;.  w.xExpr
1c410 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43  Callback = evalC
1c420 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53  onstExpr;.  w.xS
1c430 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1c440 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  0;.  w.pParse = 
1c450 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1c460 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
1c470 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  xpr);.}.../*.** 
1c480 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1c490 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
1c4a0 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
1c4b0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
1c4c0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1c4d0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
1c4e0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1c4f0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
1c500 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
1c510 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1c520 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
1c530 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
1c540 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1c550 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
1c560 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
1c570 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c580 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1c590 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
1c5a0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
1c5b0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
1c5c0 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
1c5d0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
1c5e0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
1c5f0 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20  int doHardCopy  
1c600 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72     /* Make a har
1c610 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20  d copy of every 
1c620 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
1c630 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c640 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1c650 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
1c660 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
1c670 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1c680 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c690 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
1c6a0 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74  );  /* Never get
1c6b0 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72  s this far other
1c6c0 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c  wise */.  n = pL
1c6d0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
1c6e0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
1c6f0 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
1c700 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
1c710 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
1c720 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  em->pExpr;.    i
1c730 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
1c740 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1c750 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c760 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69  target+i);.    i
1c770 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1c780 2b 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  +i ){.      sqli
1c790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1c7a0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 64 6f 48  arse->pVdbe, doH
1c7b0 61 72 64 43 6f 70 79 20 3f 20 4f 50 5f 43 6f 70  ardCopy ? OP_Cop
1c7c0 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20  y : OP_SCopy,.  
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 20 20 20 20 69 6e 52 65 67 2c 20 74 61 72        inReg, tar
1c7f0 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  get+i);.    }.  
1c800 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
1c810 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c820 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
1c830 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
1c840 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
1c850 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
1c860 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
1c870 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
1c880 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1c890 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
1c8a0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
1c8b0 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
1c8c0 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
1c8d0 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69  on.** elementati
1c8e0 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74  on of x..*/.stat
1c8f0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
1c900 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
1c910 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1c920 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1c930 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1c940 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
1c950 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
1c960 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
1c970 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
1c980 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1c990 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
1c9a0 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f  jump is taken */
1c9b0 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75  .  int jumpIfTru
1c9c0 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  e,   /* Take the
1c9d0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
1c9e0 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  WEEN is true */.
1c9f0 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
1ca00 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20      /* Take the 
1ca10 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
1ca20 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  EEN is NULL */.)
1ca30 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64  {.  Expr exprAnd
1ca40 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
1ca50 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
1ca60 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
1ca70 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
1ca80 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
1ca90 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
1caa0 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
1cab0 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
1cac0 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
1cad0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
1cae0 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
1caf0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1cb00 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
1cb10 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
1cb20 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
1cb30 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1cb40 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1cb50 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58  lect) );.  exprX
1cb60 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
1cb70 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d  ;.  exprAnd.op =
1cb80 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41   TK_AND;.  exprA
1cb90 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
1cba0 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
1cbb0 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
1cbc0 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  ght;.  compLeft.
1cbd0 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f  op = TK_GE;.  co
1cbe0 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26  mpLeft.pLeft = &
1cbf0 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66  exprX;.  compLef
1cc00 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
1cc10 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
1cc20 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67  pExpr;.  compRig
1cc30 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
1cc40 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
1cc50 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
1cc60 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
1cc70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1cc80 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
1cc90 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c  prX.iTable = sql
1cca0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ccb0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
1ccc0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 65   &regFree1);.  e
1ccd0 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
1cce0 49 53 54 45 52 3b 0a 20 20 69 66 28 20 6a 75 6d  ISTER;.  if( jum
1ccf0 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73  pIfTrue ){.    s
1cd00 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1cd10 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1cd20 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1cd30 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
1cd40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1cd50 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65  False(pParse, &e
1cd60 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1cd70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
1cd80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1cd90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1cda0 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
1cdb0 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
1cdc0 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
1cdd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1cde0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1cdf0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1ce00 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ce10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1ce20 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1ce30 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1ce40 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1ce50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1ce60 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1ce70 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1ce80 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1ce90 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1cea0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1ceb0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1cec0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1ced0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1cee0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1cef0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1cf00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1cf10 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1cf20 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1cf30 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1cf40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1cf50 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1cf60 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1cf70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1cf80 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1cf90 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1cfa0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1cfb0 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e1!=0 );.}../*.*
1cfc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cfd0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1cfe0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1cff0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1d000 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1d010 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1d020 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1d030 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
1d040 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1d050 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1d060 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1d070 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
1d080 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d090 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1d0a0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1d0b0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
1d0c0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
1d0d0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
1d0e0 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
1d0f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
1d100 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
1d110 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
1d120 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
1d130 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
1d140 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
1d150 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
1d160 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
1d170 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
1d180 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
1d190 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
1d1a0 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
1d1b0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
1d1c0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
1d1d0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
1d1e0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
1d1f0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
1d200 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
1d210 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
1d220 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
1d230 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
1d240 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
1d250 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
1d260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d270 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
1d280 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d290 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1d2a0 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1d2b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d2c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1d2d0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1d2e0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1d2f0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1d300 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1d310 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1d320 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1d330 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1d340 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1d350 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1d360 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
1d370 2a 20 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56  * Existance of V
1d380 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
1d390 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
1d3a0 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
1d3b0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
1d3c0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
1d3d0 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
1d3e0 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
1d3f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1d400 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
1d410 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
1d420 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d430 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
1d440 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1d450 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1d460 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1d470 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1d480 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1d490 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1d4a0 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
1d4b0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
1d4c0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1d4d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1d4e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1d4f0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1d500 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1d510 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1d520 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1d530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d540 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1d550 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  se, 1);.      br
1d560 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d570 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
1d580 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1d590 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1d5a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1d5b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1d5c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1d5d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1d5e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d5f0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1d600 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1d610 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d620 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d630 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d640 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1d650 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1d660 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1d670 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1d680 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1d690 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1d6a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1d6b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1d6c0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1d6d0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1d6e0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1d6f0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1d700 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1d710 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1d720 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1d730 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
1d740 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1d750 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
1d760 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
1d770 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
1d780 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
1d790 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
1d7a0 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
1d7b0 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
1d7c0 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
1d7d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d7e0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
1d7f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d800 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
1d810 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d820 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
1d830 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1d840 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
1d850 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
1d860 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d870 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
1d880 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d890 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1d8a0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1d8b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1d8c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1d8d0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1d8e0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1d8f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1d900 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1d910 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1d920 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
1d930 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1d940 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1d950 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1d980 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1d990 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1d9a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1d9b0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1d9c0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1d9d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d9e0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1d9f0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1da00 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1da10 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
1da20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1da30 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1da40 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1da50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1da60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1da70 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1da80 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1da90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1daa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1dab0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1dac0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
1dad0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1dae0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1daf0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1db00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1db10 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1db20 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1db30 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1db40 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  dest, SQLITE_NUL
1db50 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LEQ);.      test
1db60 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1db70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1db80 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1db90 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1dba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dbb0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1dbc0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1dbd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1dbe0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1dbf0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
1dc00 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1dc10 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1dc20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc30 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1dc40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1dc50 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1dc60 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1dc70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1dc80 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1dc90 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1dca0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1dcb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1dcc0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1dcd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1dce0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1dcf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dd00 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1dd10 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
1dd20 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1dd30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
1dd40 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
1dd50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1dd60 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  t, 1, jumpIfNull
1dd70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1dd80 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1dd90 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1dda0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
1ddb0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
1ddc0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
1ddd0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1dde0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
1ddf0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
1de00 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
1de10 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
1de20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1de30 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
1de40 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
1de50 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
1de60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1de70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1de80 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
1de90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1dea0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1deb0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1dec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1ded0 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1dee0 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
1def0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1df00 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1df10 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1df20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1df30 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
1df40 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
1df50 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
1df60 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1df70 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1df80 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1df90 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1dfa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dfb0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1dfc0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1dfd0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1dfe0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1dff0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1e000 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
1e010 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e020 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1e030 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1e040 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1e050 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1e060 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1e070 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
1e080 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
1e090 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
1e0a0 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
1e0b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1e0c0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
1e0d0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e0e0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1e0f0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1e100 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
1e110 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
1e120 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
1e130 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
1e140 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
1e150 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
1e160 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
1e170 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
1e180 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1e190 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
1e1a0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
1e1b0 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
1e1c0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1e1d0 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
1e1e0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1e1f0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
1e200 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
1e210 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
1e220 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
1e230 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
1e240 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e250 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
1e260 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
1e270 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42  Existance of VDB
1e280 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
1e290 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
1e2a0 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
1e2b0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
1e2c0 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
1e2d0 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
1e2e0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
1e2f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
1e300 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
1e310 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
1e320 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
1e330 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
1e340 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
1e350 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
1e360 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
1e370 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
1e380 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
1e390 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1e3a0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1e3b0 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
1e3c0 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
1e3d0 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
1e3e0 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
1e3f0 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
1e400 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
1e410 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
1e420 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1e430 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1e440 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
1e450 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
1e460 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
1e470 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
1e480 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
1e490 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
1e4a0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
1e4b0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
1e4c0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1e4d0 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
1e4e0 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
1e4f0 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
1e500 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
1e510 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
1e520 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
1e530 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
1e540 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
1e550 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
1e560 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
1e570 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
1e580 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
1e590 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
1e5a0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
1e5b0 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
1e5c0 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
1e5d0 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
1e5e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e5f0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
1e600 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
1e610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1e620 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
1e630 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
1e640 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
1e650 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1e660 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
1e670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1e680 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
1e690 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
1e6a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1e6b0 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
1e6c0 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
1e6d0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1e6e0 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
1e6f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1e700 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
1e710 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
1e720 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e730 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
1e740 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
1e750 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
1e760 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
1e770 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
1e780 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e790 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e7a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1e7b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e7c0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1e7d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1e7e0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1e7f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e800 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1e810 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e820 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e830 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1e840 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
1e850 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e860 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
1e870 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e880 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1e890 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1e8a0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1e8b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e8c0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1e8d0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
1e8e0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
1e8f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1e900 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e910 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1e920 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1e930 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1e940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e950 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1e960 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1e970 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1e980 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
1e990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e9a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1e9b0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e9c0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1e9d0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e9e0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1e9f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ea00 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ea10 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1ea20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ea30 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1ea40 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1ea50 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ea60 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1ea70 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1ea80 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1ea90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1eaa0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
1eab0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
1eac0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ead0 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
1eae0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1eaf0 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
1eb00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1eb10 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
1eb20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1eb30 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
1eb40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1eb50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
1eb60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1eb70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1eb80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1eb90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1eba0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1ebb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ebc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1ebd0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1ebe0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1ebf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ec00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1ec10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1ec20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1ec30 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1ec40 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
1ec50 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1ec60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ec70 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1ec80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ec90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1eca0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1ecb0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
1ecc0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
1ecd0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
1ece0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1ecf0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
1ed00 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1ed10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ed20 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ed30 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1ed40 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1ed50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ed60 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ed70 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1ed80 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1ed90 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
1eda0 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
1edb0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64  TK_EQ;.      cod
1edc0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1edd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1ede0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1edf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ee00 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1ee10 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
1ee20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ee30 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1ee40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ee50 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1ee60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ee70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1ee80 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1ee90 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1eea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1eeb0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1eec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1eed0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1eee0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1eef0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ef00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ef10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1ef20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ef30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1ef40 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1ef50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ef60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ef70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ef80 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
1ef90 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
1efa0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1efb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
1efc0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
1efd0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
1efe0 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   0, jumpIfNull);
1eff0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f000 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f010 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f020 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1f030 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
1f040 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
1f050 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f060 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1f070 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
1f080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f090 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1f0a0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1f0b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f0c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f0d0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1f0e0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
1f0f0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1f100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1f110 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1f120 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1f130 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1f140 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f150 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1f160 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f170 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f180 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
1f190 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1f1a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f1b0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
1f1c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f1d0 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
1f1e0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1f1f0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1f200 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1f210 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f220 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1f230 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1f240 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1f250 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1f260 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1f270 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1f280 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  );.}../*.** Do a
1f290 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
1f2a0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
1f2b0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
1f2c0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
1f2d0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
1f2e0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
1f2f0 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
1f300 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
1f310 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
1f320 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
1f330 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
1f340 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
1f350 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1f360 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
1f370 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
1f380 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1f390 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
1f3a0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1f3b0 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65  ill return 2 eve
1f3c0 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70  n if the two exp
1f3d0 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c  ressions.** real
1f3e0 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ly are equivalen
1f3f0 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74  t.  If we cannot
1f400 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
1f410 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
1f420 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65  ** identical, we
1f430 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74   return 2 just t
1f440 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
1f450 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
1f460 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65  * returns 2, the
1f470 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
1f480 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
1f490 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
1f4a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
1f4b0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
1f4c0 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30  t if you get a 0
1f4d0 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68   or 1 return, th
1f4e0 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
1f4f0 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
1f500 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1f510 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
1f520 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
1f530 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1f540 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
1f550 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
1f560 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ra 2 - that.** j
1f570 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
1f580 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
1f590 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
1f5a0 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
1f5b0 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20   an incorrect 0 
1f5c0 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20  or 1 could lead 
1f5d0 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
1f5e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f5f0 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
1f600 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
1f610 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42  .  if( pA==0||pB
1f620 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f630 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
1f640 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f650 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1f660 72 74 79 28 70 41 2c 20 45 50 5f 54 6f 6b 65 6e  rty(pA, EP_Token
1f670 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
1f680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45   );.  assert( !E
1f690 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
1f6a0 79 28 70 42 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  y(pB, EP_TokenOn
1f6b0 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
1f6c0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
1f6d0 72 6f 70 65 72 74 79 28 70 41 2c 20 45 50 5f 78  roperty(pA, EP_x
1f6e0 49 73 53 65 6c 65 63 74 29 20 7c 7c 20 45 78 70  IsSelect) || Exp
1f6f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42 2c  rHasProperty(pB,
1f700 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1f710 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  {.    return 2;.
1f720 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
1f730 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
1f740 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
1f750 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
1f760 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1f770 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
1f780 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f  ){.    if( pA->o
1f790 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
1f7a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1f7b0 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
1f7c0 42 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  B)<2 ){.      re
1f7d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f7e0 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
1f7f0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
1f800 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1f810 41 2c 20 70 42 2d 3e 70 4c 65 66 74 29 3c 32 20  A, pB->pLeft)<2 
1f820 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f830 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
1f840 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
1f850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1f860 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
1f870 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
1f880 72 6e 20 32 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 2;.  if( sqli
1f890 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1f8a0 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
1f8b0 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
1f8c0 32 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  2;.  if( sqlite3
1f8d0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
1f8e0 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
1f8f0 3e 78 2e 70 4c 69 73 74 29 20 29 20 72 65 74 75  >x.pList) ) retu
1f900 72 6e 20 32 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 2;.  if( pA->
1f910 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
1f920 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
1f930 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
1f940 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
1f950 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1f960 28 70 41 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  (pA, EP_IntValue
1f970 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21 45 78  ) ){.    if( !Ex
1f980 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 42  prHasProperty(pB
1f990 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
1f9a0 7c 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 21 3d  | pA->u.iValue!=
1f9b0 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
1f9c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
1f9d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1f9e0 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
1f9f0 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 41  UMN && ALWAYS(pA
1fa00 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
1fa10 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54  UMN) && pA->u.zT
1fa20 6f 6b 65 6e 29 7b 0a 20 20 20 20 69 66 28 20 45  oken){.    if( E
1fa30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fa40 42 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  B, EP_IntValue) 
1fa50 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 75 2e 7a  || NEVER(pB->u.z
1fa60 54 6f 6b 65 6e 3d 3d 30 29 20 29 20 72 65 74 75  Token==0) ) retu
1fa70 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 74  rn 2;.    if( st
1fa80 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  rcmp(pA->u.zToke
1fa90 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
1faa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1fab0 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  rn pA->op==TK_CO
1fac0 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20  LLATE ? 1 : 2;. 
1fad0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
1fae0 70 41 2d 3e 66 6c 61 67 73 26 45 50 5f 43 6f 6c  pA->flags&EP_Col
1faf0 6c 61 74 65 29 21 3d 28 70 42 2d 3e 66 6c 61 67  late)!=(pB->flag
1fb00 73 26 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 20  s&EP_Collate) ) 
1fb10 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1fb20 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
1fb30 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
1fb40 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
1fb50 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
1fb60 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
1fb70 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
1fb80 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
1fb90 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  any way..**.** T
1fba0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1fbb0 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
1fbc0 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
1fbd0 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
1fbe0 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
1fbf0 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
1fc00 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
1fc10 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
1fc20 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
1fc30 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
1fc40 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
1fc50 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
1fc60 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
1fc70 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
1fc80 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
1fc90 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
1fca0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1fcb0 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
1fcc0 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
1fcd0 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
1fce0 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
1fcf0 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
1fd00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1fd10 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
1fd20 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
1fd30 4c 69 73 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74  List *pB){.  int
1fd40 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
1fd50 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
1fd60 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
1fd70 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
1fd80 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
1fd90 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
1fda0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
1fdb0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
1fdc0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
1fdd0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
1fde0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1fdf0 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
1fe00 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
1fe10 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
1fe20 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
1fe30 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
1fe40 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
1fe50 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1fe60 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
1fe70 45 78 70 72 42 29 20 29 20 72 65 74 75 72 6e 20  ExprB) ) return 
1fe80 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1fe90 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
1fea0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1feb0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1fec0 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
1fed0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
1fee0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
1fef0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
1ff00 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
1ff10 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
1ff20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1ff30 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
1ff40 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
1ff50 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
1ff60 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
1ff70 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
1ff80 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
1ff90 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
1ffa0 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
1ffb0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
1ffc0 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
1ffd0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
1ffe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
1fff0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
20000 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
20010 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
20020 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
20030 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
20040 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
20050 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
20060 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
20070 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
20080 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
20090 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
200a0 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
200b0 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
200c0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
200d0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
200e0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
200f0 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
20100 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
20110 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
20120 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
20130 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
20140 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
20150 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
20160 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
20170 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
20180 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
20190 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
201a0 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
201b0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
201c0 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
201d0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
201e0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
201f0 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
20200 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
20210 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
20220 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
20230 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
20240 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
20250 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
20260 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
20270 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
20280 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
20290 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
202a0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
202b0 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  c;.    for(i=0; 
202c0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
202d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
202e0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
202f0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
20300 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
20310 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e     if( i<pSrc->n
20320 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
20330 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
20340 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74  se{.      p->nOt
20350 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  her++;.    }.  }
20360 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
20370 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
20380 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
20390 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
203a0 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20  ts to the pExpr 
203b0 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e  Function referen
203c0 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20  ce.** pSrcList. 
203d0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
203e0 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72  they do.  Also r
203f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
20400 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  e function.** ha
20410 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f  s no arguments o
20420 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74  r has only const
20430 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
20440 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
20450 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e  pExpr.** referen
20460 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20  ces columns but 
20470 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  not columns of t
20480 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70  ables found in p
20490 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  SrcList..*/.int 
204a0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
204b0 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20  sesThisSrc(Expr 
204c0 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20  *pExpr, SrcList 
204d0 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61  *pSrcList){.  Wa
204e0 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
204f0 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20   SrcCount cnt;. 
20500 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
20510 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
20520 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ION );.  memset(
20530 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
20540 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
20550 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f  back = exprSrcCo
20560 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43  unt;.  w.u.pSrcC
20570 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63  ount = &cnt;.  c
20580 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69  nt.pSrc = pSrcLi
20590 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20  st;.  cnt.nThis 
205a0 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65  = 0;.  cnt.nOthe
205b0 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
205c0 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c  WalkExprList(&w,
205d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
205e0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e  ;.  return cnt.n
205f0 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f  This>0 || cnt.nO
20600 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ther==0;.}../*.*
20610 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
20620 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
20630 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
20640 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
20650 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
20660 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
20670 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
20680 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
20690 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
206a0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
206b0 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
206c0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
206d0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
206e0 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
206f0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
20700 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
20710 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
20720 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
20730 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
20740 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
20750 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
20760 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
20770 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
20780 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
20790 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
207a0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
207b0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
207c0 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
207d0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
207e0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
207f0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
20800 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
20810 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
20820 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
20830 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
20840 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
20850 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
20860 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
20870 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
20880 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
20890 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
208a0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
208b0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
208c0 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->nFunc,.       
208d0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
208e0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
208f0 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78   This is the xEx
20900 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  prCallback for a
20910 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49   tree walker.  I
20920 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20  t is used to.** 
20930 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
20940 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
20950 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
20960 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20970 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
20980 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
20990 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
209a0 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
209b0 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72  Aggregate(Walker
209c0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
209d0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
209e0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
209f0 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  *pNC = pWalker->
20a00 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a  u.pNC;.  Parse *
20a10 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
20a20 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
20a30 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
20a40 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
20a50 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
20a60 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
20a70 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
20a80 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
20a90 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
20aa0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
20ab0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  MN: {.      test
20ac0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
20ad0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
20ae0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20af0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
20b00 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
20b10 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
20b20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
20b30 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
20b40 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
20b50 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
20b60 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
20b70 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
20b80 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
20b90 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  cList!=0) ){.   
20ba0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
20bb0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
20bc0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
20bd0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
20be0 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
20bf0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
20c00 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
20c10 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
20c20 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Col;.          a
20c30 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
20c40 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
20c50 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
20c60 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
20c70 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
20c80 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
20c90 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
20ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
20cb0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
20cc0 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
20cd0 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
20ce0 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
20cf0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
20d00 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
20d10 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
20d20 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
20d30 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
20d40 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
20d50 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
20d60 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
20d70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
20d80 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
20d90 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
20da0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
20db0 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
20dc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
20dd0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
20de0 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
20df0 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
20e00 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
20e10 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
20e20 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
20e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20e40 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
20e50 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
20e60 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
20e70 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
20e80 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
20e90 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
20ea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20eb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20ed0 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
20ee0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
20ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
20f00 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
20f10 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
20f20 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
20f30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
20f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
20f50 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
20f60 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
20f70 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
20f80 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
20f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20fa0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
20fb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
20fd0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
20fe0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
20ff0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
21000 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
21010 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
21020 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
21030 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21050 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
21060 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21070 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
21080 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
21090 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
210a0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
210b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
210c0 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
210d0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
210e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
210f0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
21100 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
21120 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
21140 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
21150 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
21170 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
21180 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
21190 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
211a0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
211b0 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
211c0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
211f0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
21200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21210 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
21220 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
21270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21290 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
212a0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
212b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
212c0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
212d0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
212e0 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
21320 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
21330 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
21340 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
21350 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
21360 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
21370 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
21380 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
21390 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
213a0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
213b0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
213c0 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
213d0 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
213e0 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
213f0 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
21400 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
21410 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
21420 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
21430 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65 28  rSetIrreducible(
21440 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
21450 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
21460 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
21470 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
21480 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
21490 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
214a0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
214b0 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
214c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
214d0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
214e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
214f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
21500 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
21510 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
21520 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
21530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
21540 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
21550 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
21560 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
21570 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
21580 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e  gs & NC_InAggFun
21590 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  c)==0.       && 
215a0 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
215b0 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32  epth==pExpr->op2
215c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
215d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
215e0 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
215f0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
21600 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
21610 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
21620 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
21630 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
21640 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
21650 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21660 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
21670 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
21680 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
21690 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
216a0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
216b0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
216c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
216d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
216e0 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
216f0 20 70 45 78 70 72 29 3d 3d 30 20 29 7b 0a 20 20   pExpr)==0 ){.  
21700 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21730 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
21740 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
21750 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
21760 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
21770 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
21780 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
21790 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
217a0 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
217b0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
217c0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
217d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
217e0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
217f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
21800 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
21810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
21820 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21830 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
21840 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
21850 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
21860 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
21870 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
21880 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
21890 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
218a0 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
218b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
218c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
218d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
218e0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
218f0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
21900 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
21910 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
21920 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
21930 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
21940 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
21950 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
21960 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
21970 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
21990 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
219a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
219b0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
219c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
219d0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
219e0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
21a00 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
21a10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
21a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
21a30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21a40 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
21a50 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
21a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21a70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21a80 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
21a90 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
21aa0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
21ab0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
21ac0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
21ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
21ae0 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
21af0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
21b00 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
21b10 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  d) );.        Ex
21b20 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c 65  prSetIrreducible
21b30 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
21b40 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
21b50 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
21b60 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
21b70 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
21b80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
21b90 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
21ba0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
21bb0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
21bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21bd0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
21be0 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
21bf0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
21c00 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
21c10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21c20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
21c30 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
21c40 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
21c50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
21c60 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
21c70 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
21c80 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
21c90 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
21ca0 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
21cb0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
21cc0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
21cd0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
21ce0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
21cf0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
21d00 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
21d10 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
21d20 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
21d30 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
21d40 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
21d50 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
21d60 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
21d70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
21d80 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
21d90 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
21da0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
21db0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
21dc0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
21dd0 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
21de0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
21df0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21e00 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
21e10 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
21e20 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
21e30 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
21e40 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
21e50 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
21e60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
21e70 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
21e80 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
21e90 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
21ea0 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
21eb0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
21ec0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
21ed0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
21ee0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
21ef0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
21f00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21f10 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
21f20 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
21f30 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
21f40 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
21f50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21f60 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
21f70 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
21f80 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
21f90 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
21fa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
21fb0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
21fc0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
21fd0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
21fe0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
21ff0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
22000 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
22010 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
22020 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
22030 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
22040 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
22050 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
22060 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22070 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
22080 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
22090 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
220a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
220b0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
220c0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
220d0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
220e0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
220f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
22100 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
22110 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
22120 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
22130 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
22140 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
22150 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
22160 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
22170 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
22180 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
22190 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
221a0 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
221b0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
221c0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
221d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
221e0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
221f0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
22200 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
22210 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
22220 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20   dallocation is 
22230 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
22240 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
22250 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
22260 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
22270 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
22280 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
22290 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
222a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
222b0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
222c0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
222d0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
222e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
222f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
22300 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
22310 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
22320 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
22330 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
22340 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
22350 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
22360 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
22370 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
22380 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
22390 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
223a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
223b0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
223c0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
223d0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
223e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
223f0 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
22400 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
22410 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
22420 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
22430 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
22440 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22450 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
22460 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
22470 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
22480 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
22490 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
224a0 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
224b0 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
224c0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
224d0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
224e0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
224f0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
22500 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
22510 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
22520 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
22530 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
22540 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
22550 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
22560 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
22570 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22580 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
22590 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
225a0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
225b0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
225c0 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
225d0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
225e0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
225f0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
22600 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
22610 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
22620 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
22630 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
22640 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
22650 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
22660 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
22670 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
22680 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
22690 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
226a0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
226b0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
226c0 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
226d0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
226e0 7d 0a                                            }.