/ Hex Artifact Content
Login

Artifact 78326e5d1fa27a88a6c037fabc6c63359695e937:


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 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
04a0: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
04b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
04c0: 46 5f 4e 4f 4e 45 3b 0a 20 20 6f 70 20 3d 20 70  F_NONE;.  op = p
04d0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
04e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
04f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70  .    assert( Exp
0500: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0510: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
0520: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
0530: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0540: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
0550: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0560: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 23  0].pExpr);.  }.#
0570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0580: 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f 70  IT_CAST.  if( op
0590: 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20 20  ==TK_CAST ){.   
05a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
05b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
05c0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
05d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
05e0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
05f0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
0600: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
0610: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
0620: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
0630: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d  TK_COLUMN || op=
0640: 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 0a 20  =TK_REGISTER) . 
0650: 20 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62    && pExpr->pTab
0660: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
0670: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
0680: 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 21 3d  && pExpr->pTab!=
0690: 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70  0 happens when p
06a0: 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61  Expr was origina
06b0: 6c 6c 79 0a 20 20 20 20 2a 2a 20 61 20 54 4b 5f  lly.    ** a TK_
06c0: 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70  COLUMN but was p
06d0: 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61  reviously evalua
06e0: 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20 69  ted and cached i
06f0: 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  n a register */.
0700: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78 70      int j = pExp
0710: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
0720: 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e  if( j<0 ) return
0730: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
0740: 47 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74 28  GER;.    assert(
0750: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26 20   pExpr->pTab && 
0760: 6a 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 6e  j<pExpr->pTab->n
0770: 43 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75 72  Col );.    retur
0780: 6e 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61  n pExpr->pTab->a
0790: 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b  Col[j].affinity;
07a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
07b0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d  xpr->affinity;.}
07c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
07d0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
07e0: 63 65 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ce for expressio
07f0: 6e 20 70 45 78 70 72 20 74 6f 20 62 65 20 74 68  n pExpr to be th
0800: 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
0810: 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79  equence named by
0820: 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72   pToken.   Retur
0830: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
0840: 20 6e 65 77 20 45 78 70 72 20 6e 6f 64 65 20 74   new Expr node t
0850: 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
0860: 73 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70  s the COLLATE op
0870: 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  erator..**.** If
0880: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
0890: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
08a0: 73 2c 20 74 68 61 74 20 66 61 63 74 20 69 73 20  s, that fact is 
08b0: 72 65 63 6f 72 64 65 64 20 69 6e 20 70 50 61 72  recorded in pPar
08c0: 73 65 2d 3e 64 62 0a 2a 2a 20 61 6e 64 20 74 68  se->db.** and th
08d0: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
08e0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 75 6e  r is returned un
08f0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 45 78 70 72  changed..*/.Expr
0900: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 64 64   *sqlite3ExprAdd
0910: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 0a 20 20  CollateToken(.  
0920: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0930: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
0940: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0950: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
0960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
0970: 20 74 68 65 20 22 43 4f 4c 4c 41 54 45 22 20 63   the "COLLATE" c
0980: 6c 61 75 73 65 20 74 6f 20 74 68 69 73 20 65 78  lause to this ex
0990: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 63 6f  pression */.  co
09a0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  nst Token *pColl
09b0: 4e 61 6d 65 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  Name   /* Name o
09c0: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
09d0: 65 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ence */.){.  if(
09e0: 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30 20   pCollName->n>0 
09f0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
0a00: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
0a10: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
0a20: 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43 6f   TK_COLLATE, pCo
0a30: 6c 6c 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  llName, 1);.    
0a40: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0a50: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0a60: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  pExpr;.      pNe
0a70: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  w->flags |= EP_C
0a80: 6f 6c 6c 61 74 65 7c 45 50 5f 53 6b 69 70 3b 0a  ollate|EP_Skip;.
0a90: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
0aa0: 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
0ab0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0ac0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0ad0: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
0ae0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
0af0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f   Expr *pExpr, co
0b00: 6e 73 74 20 63 68 61 72 20 2a 7a 43 29 7b 0a 20  nst char *zC){. 
0b10: 20 54 6f 6b 65 6e 20 73 3b 0a 20 20 61 73 73 65   Token s;.  asse
0b20: 72 74 28 20 7a 43 21 3d 30 20 29 3b 0a 20 20 73  rt( zC!=0 );.  s
0b30: 2e 7a 20 3d 20 7a 43 3b 0a 20 20 73 2e 6e 20 3d  .z = zC;.  s.n =
0b40: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
0b50: 28 73 2e 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  (s.z);.  return 
0b60: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b70: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0b80: 65 2c 20 70 45 78 70 72 2c 20 26 73 29 3b 0a 7d  e, pExpr, &s);.}
0b90: 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20 6f 76 65  ../*.** Skip ove
0ba0: 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54 45  r any TK_COLLATE
0bb0: 20 6f 72 20 54 4b 5f 41 53 20 6f 70 65 72 61 74   or TK_AS operat
0bc0: 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c 69  ors and any unli
0bd0: 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69 6b  kely().** or lik
0be0: 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74 69  elihood() functi
0bf0: 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  on at the root o
0c00: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  f an expression.
0c10: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
0c20: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
0c30: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0c40: 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26 26   while( pExpr &&
0c50: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0c60: 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29  (pExpr, EP_Skip)
0c70: 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72   ){.    if( Expr
0c80: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0c90: 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29 20  r, EP_Unlikely) 
0ca0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
0cb0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0cc0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 4c 69  (pExpr, EP_xIsLi
0cd0: 73 74 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  st) );.      ass
0ce0: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
0cf0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
0d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0d10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  xpr->op==TK_FUNC
0d20: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 45  TION );.      pE
0d30: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  xpr = pExpr->x.p
0d40: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
0d50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0d60: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d70: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
0d80: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0d90: 4b 5f 41 53 20 29 3b 0a 20 20 20 20 20 20 70 45  K_AS );.      pE
0da0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
0db0: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ft;.    }.  }   
0dc0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0de0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
0df0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0e00: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0e10: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0e20: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
0e30: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
0e40: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
0e50: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0e60: 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20   sequence might 
0e70: 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
0e80: 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
0e90: 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65  tor.** or by the
0ea0: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63   presence of a c
0eb0: 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66  olumn with a def
0ec0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0ed0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c  equence..** COLL
0ee0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61  ATE operators ta
0ef0: 6b 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65  ke first precede
0f00: 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61  nce.  Left opera
0f10: 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63  nds take.** prec
0f20: 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68  edence over righ
0f30: 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43  t operands..*/.C
0f40: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
0f50: 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  xprCollSeq(Parse
0f60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0f70: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
0f80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0f90: 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  db;.  CollSeq *p
0fa0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
0fb0: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
0fc0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
0fd0: 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  nt op = p->op;. 
0fe0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
0ff0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 62  & EP_Generic ) b
1000: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70  reak;.    if( op
1010: 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d  ==TK_CAST || op=
1020: 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20  =TK_UPLUS ){.   
1030: 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b     p = p->pLeft;
1040: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1050: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
1060: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
1070: 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45   (op==TK_REGISTE
1080: 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f  R && p->op2==TK_
1090: 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20 20  COLLATE) ){.    
10a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10b0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
10c0: 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30 2c 20  se, ENC(db), 0, 
10d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
10e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
1100: 21 3d 30 0a 20 20 20 20 20 26 26 20 28 6f 70 3d  !=0.     && (op=
1110: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
1120: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  | op==TK_COLUMN.
1130: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d            || op=
1140: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20  =TK_REGISTER || 
1150: 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a  op==TK_TRIGGER).
1160: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
1170: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1180: 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61  && p->pTab!=0 ha
1190: 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72  ppens when pExpr
11a0: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
11b0: 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f        ** a TK_CO
11c0: 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65  LUMN but was pre
11d0: 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65  viously evaluate
11e0: 64 20 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20  d and cached in 
11f0: 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  a register */.  
1200: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69      int j = p->i
1210: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66  Column;.      if
1220: 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1230: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1240: 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61  oll = p->pTab->a
1250: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1260: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1270: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
1280: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
1290: 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  oll, 0);.      }
12a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
12c0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
12d0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41  e ){.      if( A
12e0: 4c 57 41 59 53 28 70 2d 3e 70 4c 65 66 74 29 20  LWAYS(p->pLeft) 
12f0: 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66 6c  && (p->pLeft->fl
1300: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1310: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1320: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1330: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78      }else if( Ex
1340: 70 72 55 73 65 73 52 69 67 68 74 28 70 29 20 29  prUsesRight(p) )
1350: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
1360: 3e 78 2e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  >x.pRight;.     
1370: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1390: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
13a0: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
13b0: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
13c0: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
13d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
13e0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
13f0: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
1400: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
1410: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
1420: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
1430: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
1440: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
1450: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1460: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1470: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1480: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1490: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
14a0: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
14b0: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
14c0: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
14d0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
14e0: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
14f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
1500: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
1510: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
1520: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
1530: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
1540: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
1550: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1560: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1570: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1580: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1590: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
15a0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
15b0: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
15c0: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
15d0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
15e0: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
15f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1600: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1610: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1620: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1630: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
1640: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1650: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1660: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1670: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1680: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1690: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
16a0: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
16b0: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
16c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16d0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
16e0: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
16f0: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
1700: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
1710: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
1720: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
1730: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
1740: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
1750: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1760: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1770: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1780: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1790: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
17a0: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
17b0: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
17c0: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
17d0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
17e0: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
17f0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
1800: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
1810: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
1820: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
1830: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
1840: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1850: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1860: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1870: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1880: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1890: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
18a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
18b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
18c0: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
18d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
18e0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18f0: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
1900: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1910: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
1920: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
1930: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1940: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
1950: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 55 73 65  );.  if( ExprUse
1960: 73 52 69 67 68 74 28 70 45 78 70 72 29 20 29 7b  sRight(pExpr) ){
1970: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
1980: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1990: 79 28 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  y(pExpr->x.pRigh
19a0: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
19b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
19c0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
19d0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
19e0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
19f0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1a00: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1a10: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1a20: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
1a30: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
1a40: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
1a50: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72  FF_NONE;.  }.  r
1a60: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
1a70: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1a80: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
1a90: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
1aa0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
1ab0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
1ac0: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
1ad0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
1ae0: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
1af0: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
1b00: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
1b10: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
1b20: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
1b30: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
1b40: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
1b50: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1b60: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
1b70: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
1b80: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
1b90: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
1ba0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
1bb0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
1bc0: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
1bd0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1be0: 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ONE:.      retur
1bf0: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
1c00: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
1c20: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1c30: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
1c40: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1c50: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
1c60: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
1c70: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
1c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c90: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
1ca0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1cb0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
1cc0: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
1cd0: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1ce0: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1cf0: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1d00: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
1d10: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
1d20: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
1d30: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
1d40: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
1d50: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
1d60: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
1d70: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
1d80: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
1d90: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1da0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
1db0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
1dc0: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
1dd0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
1de0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1df0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e00: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1e10: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1e20: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1e30: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1e40: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1e50: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
1e60: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
1e70: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1e80: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
1e90: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
1ea0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
1eb0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
1ec0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1ed0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1ee0: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1ef0: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1f00: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1f10: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1f20: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1f30: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1f40: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1f50: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
1f60: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
1f70: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
1f80: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
1f90: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
1fa0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  red..*/.CollSeq 
1fb0: 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  *sqlite3BinaryCo
1fc0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
1fd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
1fe0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
1ff0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
2000: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
2010: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
2020: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
2030: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  ft->flags & EP_C
2040: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43  ollate ){.    pC
2050: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2060: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
2070: 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65   pLeft);.  }else
2080: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28   if( pRight && (
2090: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
20a0: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
20b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
20c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20d0: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
20e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
20f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
2100: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
2110: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
2120: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
2130: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2140: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2150: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
2160: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2170: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
2180: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2190: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
21a0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
21b0: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
21c0: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
21d0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
21e0: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
21f0: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
2200: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
2210: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
2220: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
2230: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
2240: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
2250: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
2260: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
2270: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
2280: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
2290: 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69    int in1, int i
22a0: 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20  n2, /* Register 
22b0: 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73  holding operands
22c0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
22d0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
22e0: 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a  here if true.  *
22f0: 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
2300: 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65  ll    /* If true
2310: 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72  , jump if either
2320: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
2330: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b   */.){.  int p5;
2340: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43  .  int addr;.  C
2350: 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70  ollSeq *p4;..  p
2360: 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  4 = sqlite3Binar
2370: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2380: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
2390: 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62  Right);.  p5 = b
23a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70  inaryCompareP5(p
23b0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75  Left, pRight, ju
23c0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64  mpIfNull);.  add
23d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
23e0: 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56  ddOp4(pParse->pV
23f0: 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32  dbe, opcode, in2
2400: 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20  , dest, in1,.   
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
2430: 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  4, P4_COLLSEQ);.
2440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2450: 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56  ngeP5(pParse->pV
2460: 64 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20  dbe, (u8)p5);.  
2470: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
2480: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
2490: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
24a0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
24b0: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
24c0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
24d0: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
24e0: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
24f0: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
2500: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
2510: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
2520: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
2530: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2540: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2550: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2560: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
2570: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2580: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
2590: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
25a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
25b0: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
25c0: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
25d0: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
25e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25f0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2600: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
2610: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
2620: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
2630: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
2640: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2650: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2660: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2670: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2680: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
2690: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
26a0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
26b0: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
26c0: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
26d0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
26e0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
26f0: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
2700: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
2710: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
2720: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2730: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
2740: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
2750: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
2760: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
2770: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
2780: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
2790: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
27a0: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
27b0: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
27c0: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
27d0: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
27e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27f0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
2800: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
2810: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2820: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
2830: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
2840: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
2850: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
2860: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2870: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
2880: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
2890: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
28a0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
28b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
28c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
28d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
28e0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
28f0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
2900: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2910: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2920: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
2930: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
2940: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2950: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2960: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
2970: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2980: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2990: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
29a0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
29b0: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
29c0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
29d0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
29e0: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
29f0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2a00: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
2a10: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2a20: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2a30: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
2a40: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2a50: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2a60: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
2a70: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2a80: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
2a90: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
2aa0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2ab0: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2ac0: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
2ad0: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
2ae0: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
2af0: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
2b00: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
2b10: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
2b20: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
2b30: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
2b40: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
2b50: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
2b60: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
2b70: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
2b80: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2b90: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
2ba0: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
2bb0: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73  r plus one..*/.s
2bc0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
2bd0: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
2be0: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2bf0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2c00: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
2c10: 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20  nHeight);.  if( 
2c20: 45 78 70 72 55 73 65 73 52 69 67 68 74 28 70 29  ExprUsesRight(p)
2c30: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2c40: 45 78 70 72 28 70 2d 3e 78 2e 70 52 69 67 68 74  Expr(p->x.pRight
2c50: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
2c60: 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73  else if( ExprHas
2c70: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
2c80: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
2c90: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2ca0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e  p->x.pSelect, &n
2cb0: 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  Height);.  }else
2cc0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 78  {.    assert( Ex
2cd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
2ce0: 20 45 50 5f 78 49 73 4c 69 73 74 29 20 29 3b 0a   EP_xIsList) );.
2cf0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2d00: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
2d10: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   &nHeight);.  }.
2d20: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
2d30: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
2d40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2d50: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2d60: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78 70  le using the exp
2d70: 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75 6e  rSetHeight() fun
2d80: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65  ction. If.** the
2d90: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2da0: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  er than the maxi
2db0: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72  mum allowed expr
2dc0: 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a  ession depth,.**
2dd0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2de0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
2df0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
2e00: 74 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  tHeight(Parse *p
2e10: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
2e20: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
2e30: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
2e40: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
2e50: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
2e60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2e70: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
2e80: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
2e90: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
2ea0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
2eb0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
2ec0: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
2ed0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
2ee0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2ef0: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
2f00: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f10: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f20: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
2f30: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
2f40: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
2f50: 0a 20 20 23 64 65 66 69 6e 65 20 65 78 70 72 53  .  #define exprS
2f60: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
2f70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
2f80: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
2f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2fa0: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65  tine is the core
2fb0: 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45   allocator for E
2fc0: 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  xpr nodes..**.**
2fd0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
2fe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2ff0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
3000: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
3010: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
3020: 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68   node and for th
3030: 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  e pToken argumen
3040: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c  t is a single al
3050: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61  location.** obta
3060: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
3070: 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  3DbMalloc().  Th
3080: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
3090: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
30a0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
30b0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
30c0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
30d0: 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  eed..**.** If de
30e0: 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74  quote is true, t
30f0: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69  hen the token (i
3100: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
3110: 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  dequoted..** If 
3120: 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65  dequote is false
3130: 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69  , no dequoting i
3140: 73 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20  s performance.  
3150: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
3160: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
3170: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
3180: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
3190: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
31a0: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
31b0: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
31c0: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
31d0: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
31e0: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
31f0: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
3200: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
3210: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
3220: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
3230: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
3240: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
3250: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
3260: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
3270: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
3280: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
3290: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
32a0: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
32b0: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
32c0: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
32d0: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
32e0: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
32f0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
3300: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
3310: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
3320: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
3330: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
3340: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
3350: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
3360: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
3370: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
3380: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3390: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
33a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
33b0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
33c0: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
33d0: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
33e0: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
33f0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
3400: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3410: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
3420: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
3430: 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65  oken,    /* Toke
3440: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
3450: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
3460: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
3470: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3480: 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b  to dequote */.){
3490: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
34a0: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
34b0: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20  .  int iValue = 
34c0: 30 3b 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  0;..  if( pToken
34d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   ){.    if( op!=
34e0: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54  TK_INTEGER || pT
34f0: 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20  oken->z==0.     
3500: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
3510: 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e  etInt32(pToken->
3520: 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29  z, &iValue)==0 )
3530: 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d  {.      nExtra =
3540: 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20   pToken->n+1;.  
3550: 20 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c      assert( iVal
3560: 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ue>=0 );.    }. 
3570: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69   }.  pNew = sqli
3580: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3590: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
35a0: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
35b0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
35c0: 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20  ->op = (u8)op;. 
35d0: 20 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20     pNew->iAgg = 
35e0: 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b  -1;.    if( pTok
35f0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  en ){.      if( 
3600: 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20  nExtra==0 ){.   
3610: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
3620: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
3630: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
3640: 2e 69 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65  .iValue = iValue
3650: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3660: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
3670: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3680: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70  oken = (char*)&p
3690: 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
36a0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
36b0: 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  z!=0 || pToken->
36c0: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
36d0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20  if( pToken->n ) 
36e0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a  memcpy(pNew->u.z
36f0: 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Token, pToken->z
3700: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  , pToken->n);.  
3710: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54        pNew->u.zT
3720: 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20  oken[pToken->n] 
3730: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
3740: 20 64 65 71 75 6f 74 65 20 26 26 20 6e 45 78 74   dequote && nExt
3750: 72 61 3e 3d 33 20 0a 20 20 20 20 20 20 20 20 20  ra>=3 .         
3760: 20 20 20 20 26 26 20 28 28 63 20 3d 20 70 54 6f      && ((c = pTo
3770: 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27  ken->z[0])=='\''
3780: 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d   || c=='"' || c=
3790: 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20  ='[' || c=='`') 
37a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
37b0: 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77  ite3Dequote(pNew
37c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
37d0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22         if( c=='"
37e0: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
37f0: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
3800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3810: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c   }.    }.#if SQL
3820: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
3830: 54 48 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  TH>0.    pNew->n
3840: 48 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64  Height = 1;.#end
3850: 69 66 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  if  .  }.  retur
3860: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3870: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
3880: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
3890: 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d  from a zero-term
38a0: 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61  inated token tha
38b0: 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  t has.** already
38c0: 20 62 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a   been dequoted..
38d0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
38e0: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
38f0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
3900: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
3910: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
3920: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
3930: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3950: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
3960: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
3970: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20  har *zToken     
3980: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
3990: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
39a0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e  LL */.){.  Token
39b0: 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b   x;.  x.z = zTok
39c0: 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b  en;.  x.n = zTok
39d0: 65 6e 20 3f 20 73 71 6c 69 74 65 33 53 74 72 6c  en ? sqlite3Strl
39e0: 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30  en30(zToken) : 0
39f0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3a00: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
3a10: 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  op, &x, 0);.}../
3a20: 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62 74  *.** Attach subt
3a30: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3a40: 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78 70  Right to the Exp
3a50: 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a  r node pRoot..**
3a60: 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55  .** If pRoot==NU
3a70: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
3a80: 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  at a memory allo
3a90: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
3aa0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e   occurred..** In
3ab0: 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c 65   that case, dele
3ac0: 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20  te the subtrees 
3ad0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3ae0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3af0: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
3b00: 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ees(.  sqlite3 *
3b10: 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f  db,.  Expr *pRoo
3b20: 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  t,.  Expr *pLeft
3b30: 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ,.  Expr *pRight
3b40: 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d  .){.  if( pRoot=
3b50: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
3b60: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
3b70: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
3b80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3b90: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
3ba0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3bb0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
3bc0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67  se{.    if( pRig
3bd0: 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f  ht ){.      pRoo
3be0: 74 2d 3e 78 2e 70 52 69 67 68 74 20 3d 20 70 52  t->x.pRight = pR
3bf0: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  ight;.      pRoo
3c00: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 45 50 5f  t->flags |= (EP_
3c10: 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67 68 74  Collate & pRight
3c20: 2d 3e 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  ->flags);.    }.
3c30: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
3c40: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
3c50: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
3c60: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3c70: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3c80: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  pLeft->flags;.  
3c90: 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48    }.    exprSetH
3ca0: 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20  eight(pRoot);.  
3cb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
3cc0: 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20  ate a Expr node 
3cd0: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
3ce0: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
3cf0: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
3d00: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
3d10: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
3d20: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
3d30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
3d40: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
3d50: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
3d60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
3d70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
3d80: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
3d90: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
3da0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
3db0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3dc0: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
3dd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3de0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3df0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3e20: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
3e30: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
3e40: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
3e50: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
3e60: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3e70: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3e80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3e90: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3ea0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3eb0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
3ec0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
3ed0: 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70 52  D && pLeft && pR
3ee0: 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ight ){.    /* T
3ef0: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
3f00: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
3f10: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
3f20: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
3f30: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
3f40: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3f50: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3f60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
3f70: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3f80: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
3f90: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3fa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
3fb0: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
3fc0: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
3fd0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
3fe0: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
3ff0: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
4000: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
4010: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
4020: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4030: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
4040: 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ssion is always 
4050: 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46  either TRUE or F
4060: 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65  ALSE (respective
4070: 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ly),.** then ret
4080: 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63  urn 1.  If one c
4090: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
40a0: 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20  the truth value 
40b0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
40c0: 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  sion at compile-
40d0: 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  time return 0..*
40e0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
40f0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
4100: 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72  f is OK to retur
4110: 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66  n 0 here even if
4120: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
4130: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
4140: 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c  ays false or fal
4150: 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61  se (a false nega
4160: 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74  tive)..** But it
4170: 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74   is a bug to ret
4180: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
4190: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61  ression might ha
41a0: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
41b0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69  boolean values i
41c0: 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63  n different circ
41d0: 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c  umstances (a fal
41e0: 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a  se positive.).**
41f0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
4200: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4210: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69  is part of condi
4220: 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20  tional for a.** 
4230: 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
4240: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
4250: 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ine at compile-t
4260: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
4270: 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65  ot.** is it true
4280: 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c   or false, so al
4290: 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ways return 0..*
42a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
42b0: 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72  rAlwaysTrue(Expr
42c0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
42d0: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
42e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
42f0: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
4300: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
4310: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
4320: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
4330: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d   0;.  return v!=
4340: 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  0;.}.static int 
4350: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
4360: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
4370: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
4380: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4390: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
43a0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
43b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
43c0: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
43d0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
43e0: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
43f0: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
4400: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
4410: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
4420: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
4430: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
4440: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
4450: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
4460: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
4470: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
4480: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
4490: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
44a0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
44b0: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
44c0: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
44d0: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
44e0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
44f0: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
4500: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
4510: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
4520: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
4530: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
4540: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
4550: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
4560: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4570: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
4580: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
4590: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
45a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
45b0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
45c0: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
45d0: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
45e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
45f0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4600: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4610: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4620: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
4630: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
4640: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
4650: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
4660: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
4670: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
4680: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
4690: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
46a0: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
46b0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
46c0: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
46d0: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
46e0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
46f0: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
4700: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
4710: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
4720: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
4730: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
4740: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
4750: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
4760: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
4770: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
4780: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
4790: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
47a0: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
47b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
47c0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
47d0: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
47e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
47f0: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
4800: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
4810: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
4820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
4830: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
4840: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
4850: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
4860: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
4870: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4880: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
4890: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 45 78 70  t = pList;.  Exp
48a0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
48b0: 77 2c 20 45 50 5f 78 49 73 4c 69 73 74 29 3b 0a  w, EP_xIsList);.
48c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
48d0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
48e0: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
48f0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
4900: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
4910: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
4920: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
4930: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
4940: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
4950: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
4960: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
4970: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
4980: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
4990: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
49a0: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
49b0: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
49c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
49d0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
49e0: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
49f0: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
4a00: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
4a10: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
4a20: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
4a30: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
4a40: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
4a50: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
4a60: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
4a70: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
4a80: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
4a90: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
4aa0: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
4ab0: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
4ac0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
4ad0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
4ae0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
4af0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
4b00: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
4b10: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
4b20: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
4b30: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
4b40: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
4b50: 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  enial variable n
4b60: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
4b70: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
4b80: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
4b90: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
4ba0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4bb0: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
4bc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4bd0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4be0: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
4bf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
4c00: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4c10: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4c20: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
4c30: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
4c40: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
4c50: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
4c60: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
4c70: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
4c80: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
4c90: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
4ca0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
4cb0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
4cc0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
4cd0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
4ce0: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
4cf0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
4d00: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
4d10: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
4d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
4d30: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
4d40: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
4d50: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
4d60: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4d70: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
4d80: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4d90: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
4da0: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
4db0: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
4dc0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4dd0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4de0: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
4df0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
4e00: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
4e10: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
4e20: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4e30: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4e40: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
4e50: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
4e60: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
4e70: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
4e80: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4e90: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4ea0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4eb0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
4ec0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4ed0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4ee0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4ef0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4f00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
4f10: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
4f20: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4f30: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4f40: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4f50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4f60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4f70: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4f80: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4f90: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4fa0: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
4fb0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4fc0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
4fd0: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4ff0: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
5000: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
5010: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
5020: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
5030: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
5040: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
5050: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
5060: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
5070: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
5080: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
5090: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
50a0: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
50b0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
50c0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
50d0: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
50e0: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
50f0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5100: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
5110: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
5120: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
5130: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
5140: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
5150: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
5160: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
5170: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
5180: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
5190: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
51a0: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
51b0: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
51c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
51d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
51e0: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
51f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
5200: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
5210: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
5220: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
5230: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
5240: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
5250: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
5260: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
5270: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
5280: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
5290: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
52a0: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
52b0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72   return;  /* Err
52c0: 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f  or reported thro
52d0: 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ugh db->mallocFa
52e0: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
52f0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
5300: 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  a;.        memse
5310: 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56  t(&a[pParse->nzV
5320: 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73  ar], 0, (x-pPars
5330: 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66  e->nzVar)*sizeof
5340: 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20  (a[0]));.       
5350: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d   pParse->nzVar =
5360: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
5370: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20    if( z[0]!='?' 
5380: 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  || pParse->azVar
5390: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
53a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
53b0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  e(db, pParse->az
53c0: 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20  Var[x-1]);.     
53d0: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
53e0: 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44  [x-1] = sqlite3D
53f0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20  bStrNDup(db, z, 
5400: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5410: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
5420: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
5430: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
5440: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5450: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5460: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
5470: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5480: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
5490: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
54a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
54b0: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
54c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
54d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
54e0: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
54f0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
5500: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
5510: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e  return;.  /* San
5520: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
5530: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
5540: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
5550: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
5560: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
5570: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5580: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
5590: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
55a0: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
55b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
55c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
55d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
55e0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66  lete(db, p->pLef
55f0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5600: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5610: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 7b 0a 20  P_MemToken) ){. 
5620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5630: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  ee(db, p->u.zTok
5640: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
5650: 66 28 20 45 78 70 72 55 73 65 73 52 69 67 68 74  f( ExprUsesRight
5660: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
5670: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5680: 62 2c 20 70 2d 3e 78 2e 70 52 69 67 68 74 29 3b  b, p->x.pRight);
5690: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45  .    }else if( E
56a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
56b0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
56c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
56d0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
56e0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
56f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5700: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
5710: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5720: 49 73 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 20  IsList) );.     
5730: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5740: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
5750: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
5760: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
5770: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
5780: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
5790: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
57a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
57b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
57c0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
57d0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
57e0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
57f0: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
5800: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5810: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
5820: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
5830: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
5840: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
5850: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5860: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
5870: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
5880: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
5890: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
58a0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
58b0: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
58c0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
58d0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
58e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
58f0: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
5900: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
5910: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
5920: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
5930: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
5940: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
5950: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
5960: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5970: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
5980: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
5990: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
59a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
59b0: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
59c0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
59d0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
59e0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
59f0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5a00: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
5a10: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
5a20: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
5a30: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5a40: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
5a50: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
5a60: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
5a70: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
5a80: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
5a90: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
5aa0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5b00: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5b10: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5b20: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5b30: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
5b40: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5b50: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5b60: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5b70: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
5b80: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
5b90: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
5ba0: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
5bb0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
5bc0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
5bd0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5be0: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5bf0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5c00: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5c10: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5c20: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5c30: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5c40: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5c50: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5c60: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5c70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
5c80: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
5c90: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
5ca0: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
5cb0: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
5cc0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
5cd0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5ce0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5cf0: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5d00: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5d10: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5d20: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5d30: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5d40: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5d50: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5d60: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5d70: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
5d80: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
5d90: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
5da0: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
5db0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
5dc0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
5dd0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5de0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5df0: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5e00: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5e10: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5e20: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5e30: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5e40: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5e50: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5e60: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5e70: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
5e80: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
5e90: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
5ea0: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
5eb0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
5ec0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
5ed0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5ee0: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5ef0: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5f00: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5f10: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5f20: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5f30: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5f40: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5f50: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5f60: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5f70: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5f80: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
5f90: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
5fa0: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
5fb0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5fc0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5fd0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5fe0: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5ff0: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
6000: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
6010: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
6020: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
6030: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
6040: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
6050: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
6060: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
6070: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
6080: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
6090: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61  );.  if( 0==(fla
60a0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
60b0: 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  E) ){.    nSize 
60c0: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
60d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
60e0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
60f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
6100: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
6110: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
6120: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
6130: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
6140: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
6150: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6160: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
6170: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
6180: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6190: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
61a0: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
61b0: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
61c0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
61d0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
61e0: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
61f0: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
6200: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6210: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6220: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6240: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
6250: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6260: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
6270: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
6280: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
6290: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
62a0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
62b0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
62c0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
62d0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
62e0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
62f0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
6300: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
6310: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
6320: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6330: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
6340: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6350: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
6360: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
6370: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6380: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
6390: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
63a0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
63b0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
63c0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
63d0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
63e0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
63f0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6400: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
6410: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
6420: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
6430: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
6440: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
6450: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
6460: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6470: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
6480: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
6490: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
64a0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
64b0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
64c0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
64d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
64e0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
64f0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
6500: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
6510: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
6520: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
6530: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
6540: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
6550: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
6560: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
6570: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
6580: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
6590: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
65a0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
65b0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
65c0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
65d0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
65e0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
65f0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
6600: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
6610: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
6620: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
6630: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
6640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6650: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6660: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6670: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6680: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6690: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
66a0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
66b0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
66c0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
66d0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
66e0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
66f0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
6700: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  gs);.      if( E
6710: 78 70 72 55 73 65 73 52 69 67 68 74 28 70 29 20  xprUsesRight(p) 
6720: 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65  ){.        nByte
6730: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
6740: 65 28 70 2d 3e 78 2e 70 52 69 67 68 74 2c 20 66  e(p->x.pRight, f
6750: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
6760: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6770: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
6780: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6790: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
67a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
67b0: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
67c0: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
67d0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
67e0: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
67f0: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
6800: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
6810: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
6820: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
6830: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
6840: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
6850: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
6860: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
6870: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
6880: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 78  ->pLeft and p->x
6890: 2e 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69  .pRight expressi
68a0: 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20  ons,.** if any. 
68b0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
68c0: 2c 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73  , *pzBuffer is s
68d0: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
68e0: 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65 0a  byte passed the.
68f0: 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ** portion of th
6900: 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64 20  e buffer copied 
6910: 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e  into by this fun
6920: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
6930: 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28 73   Expr *exprDup(s
6940: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6950: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20   *p, int flags, 
6960: 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a  u8 **pzBuffer){.
6970: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30    Expr *pNew = 0
6980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6990: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
69a0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
69b0: 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73  f( p ){.    cons
69c0: 74 20 69 6e 74 20 69 73 52 65 64 75 63 65 64 20  t int isReduced 
69d0: 3d 20 28 66 6c 61 67 73 26 45 58 50 52 44 55 50  = (flags&EXPRDUP
69e0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38  _REDUCE);.    u8
69f0: 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33   *zAlloc;.    u3
6a00: 32 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30  2 staticFlag = 0
6a10: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
6a20: 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73  zBuffer==0 || is
6a30: 52 65 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20  Reduced );..    
6a40: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
6a50: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
6a60: 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74   new Expr struct
6a70: 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ure. */.    if( 
6a80: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
6a90: 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75    zAlloc = *pzBu
6aa0: 66 66 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74  ffer;.      stat
6ab0: 69 63 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74  icFlag = EP_Stat
6ac0: 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ic;.    }else{. 
6ad0: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71       zAlloc = sq
6ae0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
6af0: 28 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69  (db, dupedExprSi
6b00: 7a 65 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20  ze(p, flags));. 
6b10: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20     }.    pNew = 
6b20: 28 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a  (Expr *)zAlloc;.
6b30: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
6b40: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e  .      /* Set nN
6b50: 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  ewSize to the si
6b60: 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ze allocated for
6b70: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
6b80: 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20  ointed to.      
6b90: 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73  ** by pNew. This
6ba0: 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f   is either EXPR_
6bb0: 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52  FULLSIZE, EXPR_R
6bc0: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20  EDUCEDSIZE or.  
6bd0: 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45      ** EXPR_TOKE
6be0: 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65  NONLYSIZE. nToke
6bf0: 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
6c00: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6c10: 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a  consumed.      *
6c20: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
6c30: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
6c40: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
6c50: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
6c60: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6c70: 6e 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75  nStructSize = du
6c80: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
6c90: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6ca0: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
6cb0: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
6cc0: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
6cd0: 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20     int nToken;. 
6ce0: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
6cf0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6d00: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
6d10: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
6d20: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c      nToken = sql
6d30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
6d40: 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20  u.zToken) + 1;. 
6d50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d60: 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a      nToken = 0;.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6d80: 28 20 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20  ( isReduced ){. 
6d90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45         assert( E
6da0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6db0: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  , EP_Reduced)==0
6dc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
6dd0: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e  py(zAlloc, p, nN
6de0: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
6df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
6e00: 74 20 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74  t nSize = exprSt
6e10: 72 75 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20  ructSize(p);.   
6e20: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
6e30: 6f 63 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20  oc, p, nSize);. 
6e40: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a         memset(&z
6e50: 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c  Alloc[nSize], 0,
6e60: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e   EXPR_FULLSIZE-n
6e70: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Size);.      }..
6e80: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
6e90: 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f   EP_Reduced, EP_
6ea0: 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45  TokenOnly, and E
6eb0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61  P_Static flags a
6ec0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
6ed0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
6ee0: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
6ef0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
6f00: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
6f10: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 4e  Token);.      pN
6f20: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74  ew->flags |= nSt
6f30: 72 75 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52  ructSize & (EP_R
6f40: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6f50: 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  nly);.      pNew
6f60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61 74 69  ->flags |= stati
6f70: 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a  cFlag;..      /*
6f80: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a   Copy the p->u.z
6f90: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20 69 66  Token string, if
6fa0: 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69   any. */.      i
6fb0: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
6fc0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65       char *zToke
6fd0: 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  n = pNew->u.zTok
6fe0: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c  en = (char*)&zAl
6ff0: 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20  loc[nNewSize];. 
7000: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54         memcpy(zT
7010: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
7020: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
7030: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 30    }..      if( 0
7040: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
7050: 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54  w->flags) & EP_T
7060: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
7070: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7080: 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c  the pNew->x.pSel
7090: 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70  ect or pNew->x.p
70a0: 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a  List member. */.
70b0: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
70c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
70d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
70e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
70f0: 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  x.pSelect = sqli
7100: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7110: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69   p->x.pSelect, i
7120: 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20  sReduced);.     
7130: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70     }else if( Exp
7140: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
7150: 45 50 5f 78 49 73 4c 69 73 74 29 20 29 7b 0a 20  EP_xIsList) ){. 
7160: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78           pNew->x
7170: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
7180: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
7190: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65  p->x.pList, isRe
71a0: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
71b0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
71c0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77   /* Fill in pNew
71d0: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77  ->pLeft and pNew
71e0: 2d 3e 78 2e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ->x.pRight. */. 
71f0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7200: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7210: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
7220: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
7230: 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70     zAlloc += dup
7240: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
7250: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
7260: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7270: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
7280: 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20  educed) ){.     
7290: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
72a0: 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   = exprDup(db, p
72b0: 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50  ->pLeft, EXPRDUP
72c0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
72d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
72e0: 20 45 78 70 72 55 73 65 73 52 69 67 68 74 28 70   ExprUsesRight(p
72f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7300: 20 61 73 73 65 72 74 28 20 45 78 70 72 55 73 65   assert( ExprUse
7310: 73 52 69 67 68 74 28 70 29 20 29 3b 0a 20 20 20  sRight(p) );.   
7320: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78           pNew->x
7330: 2e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  .pRight = exprDu
7340: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 52 69 67 68  p(db, p->x.pRigh
7350: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
7360: 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20  E, &zAlloc);.   
7370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7380: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
7390: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  zBuffer ){.     
73a0: 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20 3d       *pzBuffer =
73b0: 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20   zAlloc;.       
73c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
73d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78 70          if( !Exp
73e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
73f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7400: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7410: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
7420: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
7430: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
7440: 20 20 20 20 69 66 28 20 45 78 70 72 55 73 65 73      if( ExprUses
7450: 52 69 67 68 74 28 70 29 20 29 7b 0a 20 20 20 20  Right(p) ){.    
7460: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7470: 45 78 70 72 55 73 65 73 52 69 67 68 74 28 70 4e  ExprUsesRight(pN
7480: 65 77 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ew) );.         
7490: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 52 69 67 68     pNew->x.pRigh
74a0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
74b0: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 52 69 67  up(db, p->x.pRig
74c0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
74d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
74e0: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
74f0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7500: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
7510: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65  and return a dee
7520: 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62  p copy of the ob
7530: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
7540: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
7550: 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f  gument. If an OO
7560: 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65  M condition is e
7570: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c  ncountered, NULL
7580: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
7590: 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  and the db->mall
75a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65  ocFailed flag se
75b0: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
75c0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74  LITE_OMIT_CTE.st
75d0: 61 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44  atic With *withD
75e0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
75f0: 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68  With *p){.  With
7600: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
7610: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ( p ){.    int n
7620: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
7630: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
7640: 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31  0]) * (p->nCte-1
7650: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  );.    pRet = sq
7660: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7670: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
7680: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
7690: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
76a0: 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d   pRet->nCte = p-
76b0: 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72  >nCte;.      for
76c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
76d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
76e0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  Ret->a[i].pSelec
76f0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7700: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
7710: 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
7720: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
7730: 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  .pCols = sqlite3
7740: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
7750: 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30  p->a[i].pCols, 0
7760: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
7770: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
7780: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
7790: 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
77a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
77b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
77c0: 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
77d0: 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29  ine withDup(x,y)
77e0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
77f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
7800: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
7810: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
7820: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
7830: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
7840: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
7850: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
7860: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
7870: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
7880: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
7890: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
78a0: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
78b0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
78c0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
78d0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
78e0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
78f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
7900: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
7910: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
7920: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7930: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
7940: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
7950: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
7960: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
7970: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
7980: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
7990: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
79a0: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
79b0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
79c0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
79d0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
79e0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
79f0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a  t duplicated..**
7a00: 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
7a10: 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
7a20: 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
7a30: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58  f the EXPRDUP_XX
7a40: 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74  X flags..** If t
7a50: 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  he EXPRDUP_REDUC
7a60: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  E flag is set, t
7a70: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
7a80: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a  e returned is a.
7a90: 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72  ** truncated ver
7aa0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61  sion of the usua
7ab0: 6c 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  l Expr structure
7ac0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74   that will be st
7ad0: 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20  ored as.** part 
7ae0: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7af0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
7b00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7b10: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20  schema..*/.Expr 
7b20: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
7b30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7b40: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
7b50: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 44  {.  return exprD
7b60: 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c  up(db, p, flags,
7b70: 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20   0);.}.ExprList 
7b80: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
7b90: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7ba0: 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e   ExprList *p, in
7bb0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70 72  t flags){.  Expr
7bc0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74  List *pNew;.  st
7bd0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
7be0: 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64  em *pItem, *pOld
7bf0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
7c00: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
7c10: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
7c20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7c30: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w(db, sizeof(*pN
7c40: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
7c50: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
7c60: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
7c70: 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20   i = p->nExpr;. 
7c80: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58   if( (flags & EX
7c90: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30  PRDUP_REDUCE)==0
7ca0: 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d   ) for(i=1; i<p-
7cb0: 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a  >nExpr; i+=i){}.
7cc0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
7cd0: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
7ce0: 6c 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73 69  locRaw(db,  i*si
7cf0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
7d00: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
7d10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
7d20: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
7d30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7d40: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
7d50: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
7d60: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
7d70: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
7d80: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
7d90: 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c   *pOldExpr = pOl
7da0: 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  dItem->pExpr;.  
7db0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
7dc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7dd0: 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c  db, pOldExpr, fl
7de0: 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ags);.    pItem-
7df0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
7e00: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
7e10: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
7e20: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
7e30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7e40: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7e50: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
7e60: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
7e70: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
7e80: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
7e90: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
7ea0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  em->bSpanIsTab =
7eb0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e   pOldItem->bSpan
7ec0: 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d  IsTab;.    pItem
7ed0: 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ->u = pOldItem->
7ee0: 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  u;.  }.  return 
7ef0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
7f00: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
7f10: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
7f20: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
7f30: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
7f40: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
7f50: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
7f60: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
7f70: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
7f80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7f90: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
7fa0: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
7fb0: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
7fc0: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
7fd0: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
7fe0: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
7ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8000: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
8010: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
8020: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
8030: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8040: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
8050: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
8060: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
8070: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
8080: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
8090: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
80a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
80b0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
80c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
80d0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
80e0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
80f0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
8100: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
8110: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
8120: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8130: 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
8140: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8150: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
8160: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
8170: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
8180: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
8190: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
81a0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
81b0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
81c0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
81d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
81e0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
81f0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
8200: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
8210: 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Item->pSchema = 
8220: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pOldItem->pSchem
8230: 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  a;.    pNewItem-
8240: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
8250: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
8260: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
8270: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
8280: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
8290: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
82a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
82b0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
82c0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
82d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
82e0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
82f0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
8300: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
8310: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
8320: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
8330: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
8340: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
8350: 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  wItem->addrFillS
8360: 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61  ub = pOldItem->a
8370: 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20  ddrFillSub;.    
8380: 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65 74  pNewItem->regRet
8390: 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  urn = pOldItem->
83a0: 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 70  regReturn;.    p
83b0: 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  NewItem->isCorre
83c0: 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lated = pOldItem
83d0: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3b 0a  ->isCorrelated;.
83e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 76 69      pNewItem->vi
83f0: 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 70 4f 6c  aCoroutine = pOl
8400: 64 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  dItem->viaCorout
8410: 69 6e 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ine;.    pNewIte
8420: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d  m->isRecursive =
8430: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 52 65 63   pOldItem->isRec
8440: 75 72 73 69 76 65 3b 0a 20 20 20 20 70 4e 65 77  ursive;.    pNew
8450: 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73  Item->zIndex = s
8460: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8470: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e  b, pOldItem->zIn
8480: 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  dex);.    pNewIt
8490: 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
84a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e   pOldItem->notIn
84b0: 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  dexed;.    pNewI
84c0: 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f  tem->pIndex = pO
84d0: 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a  ldItem->pIndex;.
84e0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
84f0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
8500: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
8510: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
8520: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
8530: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
8540: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
8550: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
8560: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
8570: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
8580: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
8590: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
85a0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
85b0: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
85c0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
85d0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
85e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
85f0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
8600: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
8610: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
8620: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
8630: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
8640: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
8650: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
8660: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
8670: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
8680: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
8690: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
86a0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
86b0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
86c0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
86d0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
86e0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
86f0: 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20  nId = p->nId;.  
8700: 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65  pNew->a = sqlite
8710: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8720: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
8730: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
8740: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
8750: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8760: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
8770: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8780: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63  /* Note that bec
8790: 61 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ause the size of
87a0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
87b0: 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f  for p->a[] is no
87c0: 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69  t.  ** necessari
87d0: 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ly a power of tw
87e0: 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  o, sqlite3IdList
87f0: 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74  Append() may not
8800: 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20   be called.  ** 
8810: 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  on the duplicate
8820: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
8830: 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20   function. */.  
8840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
8850: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
8860: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
8870: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
8880: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
8890: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
88a0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
88b0: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
88c0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
88d0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
88e0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
88f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8900: 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  idx = pOldItem->
8910: 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  idx;.  }.  retur
8920: 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74  n pNew;.}.Select
8930: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
8940: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
8950: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
8960: 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20  lags){.  Select 
8970: 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pNew, *pPrior;.
8980: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
8990: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
89a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
89b0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
89c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
89d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
89e0: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
89f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8a00: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
8a10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8a20: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
8a30: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
8a40: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
8a50: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
8a60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a70: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
8a80: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8a90: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
8aa0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8ab0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
8ac0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
8ad0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
8ae0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
8af0: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
8b00: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
8b10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8b20: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
8b30: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
8b40: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
8b50: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
8b60: 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69   = pPrior = sqli
8b70: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
8b80: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67   p->pPrior, flag
8b90: 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  s);.  if( pPrior
8ba0: 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
8bb0: 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
8bc0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e  >pNext = 0;.  pN
8bd0: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
8be0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8bf0: 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73  p->pLimit, flags
8c00: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
8c10: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
8c20: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
8c30: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  et, flags);.  pN
8c40: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
8c50: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
8c60: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  = 0;.  pNew->sel
8c70: 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
8c80: 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70  ags & ~SF_UsesEp
8c90: 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d  hemeral;.  pNew-
8ca0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
8cb0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
8cc0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
8cd0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65   -1;.  pNew->nSe
8ce0: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
8cf0: 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d  lectRow;.  pNew-
8d00: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
8d10: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
8d20: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
8d30: 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73  .#else.Select *s
8d40: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
8d50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
8d60: 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ect *p, int flag
8d70: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  s){.  assert( p=
8d80: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  =0 );.  return 0
8d90: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
8da0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
8db0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20  ment to the end 
8dc0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
8dd0: 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74   list.  If pList
8de0: 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79   is.** initially
8df0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61   NULL, then crea
8e00: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
8e10: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8e20: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8e30: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
8e40: 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20  urs, the entire 
8e50: 6c 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e  list is freed an
8e60: 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  d.** NULL is ret
8e70: 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e  urned.  If non-N
8e80: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ULL is returned,
8e90: 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
8ea0: 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74  anteed.** that t
8eb0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73  he new entry was
8ec0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70   successfully ap
8ed0: 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c  pended..*/.ExprL
8ee0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
8ef0: 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61  ListAppend(.  Pa
8f00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8f10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8f20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8f30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8f40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
8f50: 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64   which to append
8f60: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
8f70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f90: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  Expression to be
8fa0: 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74   appended. Might
8fb0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
8fc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8fe0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
8ff0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
9000: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
9010: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
9020: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
9030: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  st==0 ){.      g
9040: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
9050: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
9060: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9070: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
9080: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
9090: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d    if( pList->a==
90a0: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
90b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
90c0: 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c  ist->nExpr & (pL
90d0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d  ist->nExpr-1))==
90e0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
90f0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
9100: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
9110: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
9120: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
9130: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
9140: 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45  st->a, pList->nE
9150: 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69  xpr*2*sizeof(pLi
9160: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
9170: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
9180: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
9190: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
91a0: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73  a = a;.  }.  ass
91b0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
91c0: 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20   );.  if( 1 ){. 
91d0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
91e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
91f0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
9200: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
9210: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
9220: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
9230: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
9240: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
9250: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
9260: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
9270: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
9280: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
9290: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
92a0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
92b0: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
92c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
92d0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
92e0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
92f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9300: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
9310: 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Name element of 
9320: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9330: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
9340: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
9350: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
9360: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
9370: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
9380: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
9390: 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  Name should neve
93a0: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
93b0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
93c0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
93d0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
93e0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
93f0: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
9400: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
9410: 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  tSetName(.  Pars
9420: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9430: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9440: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9450: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
9460: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
9470: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
9480: 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  span. */.  Token
9490: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
94a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65     /* Name to be
94b0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
94c0: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
94d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
94e0: 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  ause the name to
94f0: 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a   be dequoted */.
9500: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  ){.  assert( pLi
9510: 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  st!=0 || pParse-
9520: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9530: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
9540: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
9550: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9560: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
9570: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
9580: 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
9590: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
95a0: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
95b0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
95c0: 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  zName==0 );.    
95d0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
95e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
95f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
9600: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
9610: 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65  .    if( dequote
9620: 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
9630: 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74   ) sqlite3Dequot
9640: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
9650: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
9660: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
9670: 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74  [].zSpan element
9680: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
9690: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
96a0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
96b0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
96c0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
96d0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
96e0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
96f0: 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20  ut pSpan should 
9700: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
9710: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
9720: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
9730: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
9740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
9750: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
9760: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
9770: 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20  rListSetSpan(.  
9780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9790: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
97a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
97b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
97c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
97d0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
97e0: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45  the span. */.  E
97f0: 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20  xprSpan *pSpan  
9800: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
9810: 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  an to be added *
9820: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
9830: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9840: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9850: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
9860: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
9870: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
9880: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9890: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
98a0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
98b0: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
98c0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
98d0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  pr>0 );.    asse
98e0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
98f0: 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70  iled || pItem->p
9900: 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78  Expr==pSpan->pEx
9910: 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr );.    sqlite
9920: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
9930: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
9940: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
9950: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
9960: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
9970: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
99a0: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
99b0: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
99c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
99d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
99e0: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
99f0: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
9a00: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
9a10: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
9a20: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
9a30: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
9a40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
9a50: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
9a60: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
9a70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
9a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
9a90: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
9aa0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
9ab0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
9ac0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
9ad0: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
9ae0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
9af0: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
9b00: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
9b10: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
9b20: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
9b30: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
9b40: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
9b50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9b60: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
9b70: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
9b80: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bject);.  }.}../
9b90: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
9ba0: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
9bb0: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
9bc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9bd0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
9be0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
9bf0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
9c00: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9c10: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
9c20: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
9c30: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
9c40: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c  List->a!=0 || pL
9c50: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b  ist->nExpr==0 );
9c60: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
9c70: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
9c80: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
9c90: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
9ca0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9cb0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
9cc0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
9cd0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
9ce0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
9cf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d00: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
9d10: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
9d20: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
9d30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
9d40: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
9d50: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
9d60: 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20  ines are Walker 
9d70: 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b  callbacks.  Walk
9d80: 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69  er.u.pi is a poi
9d90: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e  nter.** to an in
9da0: 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f  teger.  These ro
9db0: 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b  utines are check
9dc0: 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
9dd0: 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69  n to see.** if i
9de0: 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t is a constant.
9df0: 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e    Set *Walker.u.
9e00: 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20 65  pi to 0 if the e
9e10: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
9e20: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  not constant..**
9e30: 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61  .** These callba
9e40: 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ck routines are 
9e50: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
9e60: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
9e70: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
9e80: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9e90: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
9ea0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
9eb0: 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20  otJoin().**     
9ec0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9ed0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
9ee0: 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ).**.*/.static i
9ef0: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
9f00: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
9f10: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
9f20: 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57  pr){..  /* If pW
9f30: 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33 20  alker->u.i is 3 
9f40: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
9f50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f60: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
9f70: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
9f80: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
9f90: 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  a join disqualif
9fa0: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
9fb0: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
9fc0: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
9fd0: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
9fe0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33   pWalker->u.i==3
9ff0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
a000: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
a010: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
a020: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
a030: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
a040: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
a050: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
a060: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
a070: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
a080: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
a090: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
a0a0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
a0b0: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
a0c0: 72 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  r pWalker->u.i==
a0d0: 32 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f  2 or the functio
a0e0: 6e 20 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f  n as the SQLITE_
a0f0: 46 55 4e 43 5f 43 4f 4e 53 54 0a 20 20 20 20 2a  FUNC_CONST.    *
a100: 2a 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  * flag. */.    c
a110: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
a120: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
a130: 65 72 2d 3e 75 2e 69 3d 3d 32 20 7c 7c 20 45 78  er->u.i==2 || Ex
a140: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a150: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 61 6e 74 29  xpr,EP_Constant)
a160: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a170: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
a180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
a190: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
a1a0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
a1b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
a1c0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
a1d0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
a1e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
a1f0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
a200: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a210: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
a220: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
a230: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
a240: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a250: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
a260: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
a270: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a280: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a290: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
a2a0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
a2b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
a2c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
a2d0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
a2e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
a2f0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
a300: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
a310: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
a320: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
a330: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
a340: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
a350: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
a360: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
a370: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
a380: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
a390: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
a3a0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
a3b0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
a3c0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
a3d0: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
a3e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a3f0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
a400: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
a410: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
a420: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
a430: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
a440: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
a450: 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Flag){.  Walker 
a460: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
a470: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
a480: 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61   w.u.i = initFla
a490: 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
a4a0: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
a4b0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
a4c0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
a4d0: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
a4e0: 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  stant;.  sqlite3
a4f0: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
a500: 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b  .  return w.u.i;
a510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
a520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
a530: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
a540: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a550: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
a560: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
a570: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
a580: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
a590: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
a5a0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
a5b0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
a5c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
a5d0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
a5e0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
a5f0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
a600: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
a610: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
a620: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
a630: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a640: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
a650: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
a660: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
a670: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  1);.}../*.** Wal
a680: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
a690: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
a6a0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
a6b0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
a6c0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
a6d0: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
a6e0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
a6f0: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
a700: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
a710: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
a720: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
a730: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
a740: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
a750: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
a760: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
a770: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
a780: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
a790: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
a7a0: 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 3);.}../*.*
a7b0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
a7c0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
a7d0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
a7e0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
a7f0: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
a800: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
a810: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
a820: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
a830: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
a840: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
a850: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
a860: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
a870: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
a880: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
a890: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
a8a0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
a8b0: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
a8c0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
a8d0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
a8e0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
a8f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a900: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a910: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
a920: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
a930: 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a  Const(p, 2);.}..
a940: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
a950: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
a960: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
a970: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
a980: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
a990: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
a9a0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
a9b0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
a9c0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
a9d0: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
a9e0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a9f0: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
aa00: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
aa10: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
aa20: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
aa30: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
aa40: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
aa50: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
aa60: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
aa70: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
aa80: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
aa90: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
aaa0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
aab0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
aac0: 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
aad0: 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
aae0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
aaf0: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
ab00: 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
ab10: 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
ab20: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
ab30: 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
ab40: 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
ab50: 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
ab60: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
ab70: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
ab80: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
ab90: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
aba0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
abb0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
abc0: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
abd0: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
abe0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
abf0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
ac00: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
ac10: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
ac20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
ac30: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
ac40: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
ac50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
ac70: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
ac80: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
ac90: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
aca0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
acb0: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
acc0: 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
acd0: 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
ace0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
acf0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
ad00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ad20: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
ad30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ad40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ad50: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
ad60: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
ad70: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
ad80: 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
ad90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
ada0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
adb0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
adc0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
add0: 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
ade0: 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
adf0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
ae00: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
ae10: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
ae20: 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
ae30: 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
ae40: 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
ae50: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
ae60: 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
ae70: 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
ae80: 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
ae90: 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
aea0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
aeb0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
aec0: 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
aed0: 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
aee0: 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
aef0: 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
af00: 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
af10: 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
af20: 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
af30: 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
af40: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
af50: 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
af60: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
af70: 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
af80: 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
af90: 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
afa0: 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
afb0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
afc0: 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
afd0: 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
afe0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
aff0: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
b000: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
b010: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
b020: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
b030: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
b040: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
b050: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
b060: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b070: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
b080: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
b090: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
b0a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
b0b0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
b0c0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
b0d0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b0e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b0f0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
b100: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
b110: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
b120: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
b130: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
b140: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
b150: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
b160: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
b170: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
b180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b190: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b1a0: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
b1b0: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
b1c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
b1d0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
b1e0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
b1f0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
b200: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
b210: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
b220: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
b230: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
b240: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
b250: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b260: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
b270: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
b280: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
b290: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
b2a0: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
b2b0: 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  FF_NONE ) return
b2c0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
b2d0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
b2e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
b2f0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
b300: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
b310: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
b320: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
b330: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
b340: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
b350: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
b360: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
b370: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
b380: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
b390: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
b3a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b3b0: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
b3c0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
b3d0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
b3e0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
b3f0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
b400: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
b410: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b420: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b430: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
b440: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
b450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b460: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b470: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b480: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
b490: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
b4a0: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
b4b0: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
b4c0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
b4d0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
b4e0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
b4f0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
b500: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
b510: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
b520: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
b530: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
b550: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
b560: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
b570: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
b580: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
b590: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
b5a0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
b5b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
b5c0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b5d0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
b5e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b5f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b600: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
b610: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b620: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b630: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
b640: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
b650: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
b660: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
b670: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
b680: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
b690: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
b6a0: 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  a.** query of th
b6b0: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
b6c0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
b6d0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  ...).**.** Where
b6e0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63   the SELECT... c
b6f0: 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63  lause is as spec
b700: 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72  ified by the par
b710: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a  ameter to this.*
b720: 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  * routine..**.**
b730: 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   The Select obje
b740: 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73  ct passed in has
b750: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
b760: 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e  eprocessed and n
b770: 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65  o.** errors have
b780: 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a   been found..*/.
b790: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b7a0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
b7b0: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
b7c0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
b7d0: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
b7e0: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
b7f0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
b800: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
b810: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
b820: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b830: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
b840: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
b850: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
b860: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
b870: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
b880: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
b890: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
b8a0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
b8b0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
b8c0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
b8d0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
b8e0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
b8f0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
b900: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
b910: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
b920: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
b930: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
b940: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
b950: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
b960: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
b970: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
b980: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
b990: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
b9a0: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
b9b0: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
b9c0: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
b9d0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
b9e0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
b9f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
ba00: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
ba10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
ba20: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
ba30: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
ba40: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba60: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
ba70: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
ba80: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
ba90: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
baa0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
bab0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
bac0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
bad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
bae0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
baf0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
bb00: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
bb10: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
bb20: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
bb30: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
bb40: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
bb50: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
bb60: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
bb70: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
bb80: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
bb90: 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e  0].pTab;.  if( N
bba0: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
bbb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
bbc0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
bbd0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
bbe0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
bbf0: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
bc00: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
bc10: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
bc20: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
bc30: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
bc40: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
bc50: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
bc60: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
bc70: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
bc80: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
bc90: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69   /* One column i
bca0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
bcb0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
bcc0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
bcd0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
bce0: 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c  turn 0; /* Resul
bcf0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  t is a column */
bd00: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
bd10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
bd20: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
bd30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
bd40: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
bd50: 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ion and allocate
bd60: 20 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66   space for its f
bd70: 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20  lag. Return the 
bd80: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
bd90: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
bda0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
bdb0: 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65  e3CodeOnce(Parse
bdc0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
bdd0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bde0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
bdf0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
be00: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
be10: 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ed */.  return s
be20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
be30: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61  (v, OP_Once, pPa
be40: 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d  rse->nOnce++);.}
be50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
be60: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ction is used by
be70: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
be80: 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e  ion of the IN (.
be90: 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ..) operator..**
bea0: 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65   The pX paramete
beb0: 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73  r is the express
bec0: 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ion on the RHS o
bed0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
bee0: 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  r, which.** migh
bef0: 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69  t be either a li
bf00: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
bf10: 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  s or a subquery.
bf20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
bf30: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
bf40: 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65  s to find or cre
bf50: 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a  ate a b-tree obj
bf60: 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20  ect that can.** 
bf70: 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74  be used either t
bf80: 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65  o test for membe
bf90: 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53  rship in the RHS
bfa0: 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61   set or to itera
bfb0: 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c  te through.** al
bfc0: 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65  l members of the
bfd0: 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69   RHS set, skippi
bfe0: 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  ng duplicates..*
bff0: 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73  *.** A cursor is
c000: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62   opened on the b
c010: 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
c020: 74 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  t the RHS of the
c030: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
c040: 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
c050: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
c060: 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
c070: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
c080: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
c090: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
c0a0: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
c0b0: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
c0c0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
c0d0: 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
c0e0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
c0f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
c100: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
c110: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
c120: 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
c130: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
c140: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
c150: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
c160: 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
c170: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
c180: 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
c190: 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
c1a0: 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
c1b0: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
c1c0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
c1d0: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
c1e0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
c210: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
c220: 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
c230: 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65   b-tree might be
c240: 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48 53   used if the RHS
c250: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69   expression pX i
c260: 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75  s a simple.** su
c270: 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a  bquery such as:.
c280: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
c290: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
c2a0: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
c2b0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
c2c0: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
c2d0: 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20 63  list or a more c
c2e0: 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79 2c  omplex subquery,
c2f0: 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65   then.** an ephe
c300: 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67 68  meral table migh
c310: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65 6e  t need to be gen
c320: 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
c330: 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20  RHS and then.** 
c340: 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65 20  pX->iTable made 
c350: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
c360: 65 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65  ephermeral table
c370: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
c380: 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
c390: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
c3a0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
c3b0: 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
c3c0: 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
c3d0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
c3e0: 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
c3f0: 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20  he set members, 
c400: 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70  skipping any dup
c410: 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73  licates. In this
c420: 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65   case an.** ephe
c430: 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
c440: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
c450: 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f  the selected <co
c460: 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74  lumn> is guarant
c470: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
c480: 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
c490: 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
c4a0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
c4b0: 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61  Y or it.** has a
c4c0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
c4d0: 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  nt or UNIQUE ind
c4e0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
c4f0: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
c500: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
c510: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
c520: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
c530: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
c540: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20  mbership tests. 
c550: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20  In this case an 
c560: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
c570: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
c580: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
c590: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
c5a0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
c5b0: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
c5c0: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
c5d0: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
c5e0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
c5f0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
c600: 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
c610: 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
c620: 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
c630: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
c640: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
c650: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c660: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
c670: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
c680: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
c690: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
c6a0: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
c6b0: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
c6c0: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
c6d0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
c6e0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
c6f0: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
c700: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
c710: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
c720: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
c730: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
c740: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
c750: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
c760: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20  *prNotFound. If 
c770: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
c780: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
c790: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
c7a0: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
c7b0: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20   *prNotFound is 
c7c0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
c7d0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
c7e0: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
c7f0: 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
c800: 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e  n stored in *prN
c810: 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a  otFound, then.**
c820: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c   its initial val
c830: 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66 20  ue is NULL.  If 
c840: 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73 20 6e  the (...) does n
c850: 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61  ot remain consta
c860: 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75  nt.** for the du
c870: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75  ration of the qu
c880: 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45  ery (i.e. the SE
c890: 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68 65 20  LECT within the 
c8a0: 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 63 6f  (...).** is a co
c8b0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
c8c0: 79 29 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  y) then the valu
c8d0: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
c8e0: 65 64 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ed register is.*
c8f0: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
c900: 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 73 75  each time the su
c910: 62 71 75 65 72 79 20 69 73 20 72 65 72 75 6e 2e  bquery is rerun.
c920: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
c930: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 75 73  .** caller to us
c940: 65 20 76 64 62 65 20 63 6f 64 65 20 65 71 75 69  e vdbe code equi
c950: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f  valent to the fo
c960: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
c970: 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e   if( register==N
c980: 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61  ULL ){.**     ha
c990: 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69  s_null = <test i
c9a0: 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  f data structure
c9b0: 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a   contains null>.
c9c0: 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20  **     register 
c9d0: 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  = 1.**   }.**.**
c9e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
c9f0: 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c  id running the <
ca00: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
ca10: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
ca20: 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f  null>.** test mo
ca30: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73  re often than is
ca40: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23   necessary..*/.#
ca50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ca60: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
ca70: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
ca80: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
ca90: 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20  , Expr *pX, int 
caa0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20  *prNotFound){.  
cab0: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
cae0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
caf0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
cb00: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
cb30: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
cb40: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
cb50: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
cb60: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
cb70: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
cb80: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
cb90: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
cba0: 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e  que = (prNotFoun
cbb0: 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72 75 65  d==0);   /* True
cbc0: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
cbd0: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
cbe0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
cbf0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
cc00: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
cc10: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
cc20: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
cc30: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
cc40: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
cc50: 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
cc60: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
cc70: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
cc80: 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
cc90: 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
cca0: 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
ccb0: 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
ccc0: 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
ccd0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20  table..  */.  p 
cce0: 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  = (ExprHasProper
ccf0: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
cd00: 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65  ect) ? pX->x.pSe
cd10: 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28  lect : 0);.  if(
cd20: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
cd30: 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61  nErr==0) && isCa
cd40: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
cd50: 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p) ){.    sqlite
cd60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cd70: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
cd80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
cd90: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54  nection */.    T
cda0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c        /* Table <
cdd0: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45  table>. */.    E
cde0: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
ce10: 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a  ion <column> */.
ce20: 20 20 20 20 69 31 36 20 69 43 6f 6c 3b 20 20 20      i16 iCol;   
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
ce50: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63  dex of column <c
ce60: 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31  olumn> */.    i1
ce70: 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  6 iDb;          
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
cea0: 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f   idx for pTab */
ceb0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 20  ..    assert( p 
cec0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
ced0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
cee0: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
cef0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
cf00: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
cf10: 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
cf20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
cf30: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
cf40: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
cf50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
cf60: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
cf70: 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
cf80: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
cf90: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
cfa0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
cfb0: 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
cfc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
cfd0: 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
cfe0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
cff0: 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
d000: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
d010: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  .    pExpr = p->
d020: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
d030: 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 28  pr;.    iCol = (
d040: 69 31 36 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75  i16)pExpr->iColu
d050: 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43  mn;.   .    /* C
d060: 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61  ode an OP_Transa
d070: 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62  ction and OP_Tab
d080: 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c  leLock for <tabl
d090: 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  e>. */.    iDb =
d0a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
d0b0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
d0c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
d0d0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
d0e0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
d0f0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  b);.    sqlite3T
d100: 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
d110: 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
d120: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
d130: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
d140: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
d150: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f   called from two
d160: 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68   places. In both
d170: 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a   cases the vdbe.
d180: 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
d190: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
d1a0: 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c  d. So assume sql
d1b0: 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73  ite3GetVdbe() is
d1c0: 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73   always.    ** s
d1d0: 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a  uccessful here..
d1e0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
d1f0: 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43  t(v);.    if( iC
d200: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ol<0 ){.      in
d210: 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
d220: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
d230: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
d240: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
d250: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
d260: 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
d270: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
d280: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
d290: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d2a0: 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
d2b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d2c0: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
d2d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
d2e0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
d310: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
d320: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
d330: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
d340: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
d350: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
d360: 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  is to.      ** b
d370: 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  e used in place 
d380: 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c  of a temp-table,
d390: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65   it must be orde
d3a0: 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20  red according.  
d3b0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63      ** to this c
d3c0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d3d0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c  e.  */.      Col
d3e0: 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
d3f0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
d400: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
d410: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70   pX->pLeft, pExp
d420: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  r);..      /* Ch
d430: 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
d440: 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
d450: 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
d460: 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  rm the .      **
d470: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
d480: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
d490: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63  ffinity of the c
d4a0: 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20  olumn. If.      
d4b0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  ** it is not, it
d4c0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
d4d0: 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65   to use any inde
d4e0: 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
d4f0: 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
d500: 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  k = sqlite3Index
d510: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70  AffinityOk(pX, p
d520: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d530: 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20  affinity);..    
d540: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
d550: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
d560: 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66   eType==0 && aff
d570: 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70  inity_ok; pIdx=p
d580: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
d590: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e       if( (pIdx->
d5a0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
d5b0: 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  l).         && s
d5c0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
d5d0: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70  q(db, ENC(db), p
d5e0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20  Idx->azColl[0], 
d5f0: 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20  0)==pReq.       
d600: 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69    && (!mustBeUni
d610: 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b  que || (pIdx->nK
d620: 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78  eyCol==1 && pIdx
d630: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
d640: 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ne)).        ){.
d650: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
d660: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
d670: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
d680: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d690: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d6a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d6b0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
d6c0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
d6d0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
d6e0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
d6f0: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
d700: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  dx);.          V
d710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d720: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
d730: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
d740: 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
d750: 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
d760: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
d770: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  1 );.          e
d780: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
d790: 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78  INDEX_ASC + pIdx
d7a0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b  ->aSortOrder[0];
d7b0: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
d7c0: 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70  prNotFound && !p
d7d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d7e0: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
d7f0: 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75         *prNotFou
d800: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
d810: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
d820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d830: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
d840: 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a  , *prNotFound);.
d850: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d870: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
d880: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
d890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d8a0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
d8b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
d8c0: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20 65 78   not found an ex
d8d0: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
d8e0: 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20  index to use as 
d8f0: 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a  the RHS b-tree..
d900: 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68      ** We will h
d910: 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ave to generate 
d920: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
d930: 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62  le to do the job
d940: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32  ..    */.    u32
d950: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
d960: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72   = pParse->nQuer
d970: 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72  yLoop;.    int r
d980: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
d990: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
d9a0: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
d9b0: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b  f( prNotFound ){
d9c0: 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75  .      *prNotFou
d9d0: 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  nd = rMayHaveNul
d9e0: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
d9f0: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
da00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
da10: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72 4e 6f  P_Null, 0, *prNo
da20: 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d 65 6c  tFound);.    }el
da30: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  se{.      pParse
da40: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
da50: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
da60: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
da70: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
da80: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
da90: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
daa0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
dab0: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
dac0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
dad0: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
dae0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
daf0: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
db00: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
db10: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
db20: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
db30: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
db40: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
db50: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
db60: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
db70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
db80: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
db90: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
dba0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
dbb0: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
dbc0: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
dbd0: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
dbe0: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
dbf0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
dc00: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
dc10: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
dc20: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
dc30: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
dc40: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
dc50: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
dc60: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
dc70: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
dc80: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
dc90: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
dca0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
dcb0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
dcc0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
dcd0: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
dce0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
dcf0: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
dd00: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
dd10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
dd20: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
dd30: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
dd40: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
dd50: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
dd60: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
dd70: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
dd80: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
dd90: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
dda0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
ddb0: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
ddc0: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
ddd0: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
dde0: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
ddf0: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
de00: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
de10: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
de20: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
de30: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
de40: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
de50: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
de60: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
de70: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
de80: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
de90: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
dea0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
deb0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
dec0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
ded0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
dee0: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
def0: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
df00: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
df10: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
df20: 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74 68 65  NULLs..** Furthe
df30: 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20 69 73  rmore, the IN is
df40: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
df50: 73 65 20 61 6e 64 20 74 68 61 74 20 77 65 20 72  se and that we r
df60: 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 6f  eally want.** to
df70: 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 74 68   iterate over th
df80: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
df90: 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72 64 65  operator in orde
dfa0: 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c 6f 63  r to quickly loc
dfb0: 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72 72 65  ate.** all corre
dfc0: 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65 6c 65  sponding LHS ele
dfd0: 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68 69 73  ments.  All this
dfe0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
dff0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 74   initialize.** t
e000: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
e010: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
e020: 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  l to NULL.  Call
e030: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
e040: 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65 20 6f  l take.** care o
e050: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
e060: 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 20 74  register value t
e070: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
e080: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
e090: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
e0a0: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a 65 72  yHaveNull is zer
e0b0: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
e0c0: 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
e0d0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a 2a 2a  is being used.**
e0e0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20   for membership 
e0f0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  testing only.  T
e100: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
e110: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  to initialize an
e120: 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74  y.** registers t
e130: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 70  o indicate the p
e140: 72 65 73 65 6e 63 65 20 6f 72 20 61 62 73 65 6e  resence or absen
e150: 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e 20 74  ce of NULLs on t
e160: 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f  he RHS..**.** Fo
e170: 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  r a SELECT or EX
e180: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72  ISTS operator, r
e190: 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
e1a0: 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  er that holds th
e1b0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f  e.** result.  Fo
e1c0: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
e1d0: 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
e1e0: 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  curs, the return
e1f0: 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a   value is 0..*/.
e200: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e210: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
e220: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
e230: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
e240: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
e250: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e260: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
e270: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
e280: 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45   /* The IN, SELE
e290: 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70  CT, or EXISTS op
e2a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
e2b0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 20 20  rMayHaveNull,   
e2c0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
e2d0: 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65  that records whe
e2e0: 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74  ther NULLs exist
e2f0: 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74   in RHS */.  int
e300: 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20   isRowid        
e310: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
e320: 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61   LHS of IN opera
e330: 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a  tor is a rowid *
e340: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  /.){.  int testA
e350: 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ddr = -1;       
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e370: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
e380: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
e390: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
e3c0: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
e3d0: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
e3e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
e3f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e400: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
e410: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
e420: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
e430: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
e440: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
e450: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
e460: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
e470: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
e480: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
e490: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
e4a0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
e4b0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
e4c0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
e4d0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
e4e0: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
e4f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
e500: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
e510: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
e520: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
e530: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
e540: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
e550: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
e560: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
e570: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
e580: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
e590: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
e5a0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
e5b0: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
e5c0: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
e5d0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
e5e0: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
e5f0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
e600: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
e610: 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
e620: 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c    testAddr = sql
e630: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
e640: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
e650: 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ge(v);.  }..#ifn
e660: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e670: 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50  EXPLAIN.  if( pP
e680: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
e690: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
e6a0: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
e6b0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
e6c0: 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54  rse->db, "EXECUT
e6d0: 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20  E %s%s SUBQUERY 
e6e0: 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e 3d 30  %d", testAddr>=0
e6f0: 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
e700: 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ",.        pExpr
e710: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53  ->op==TK_IN?"LIS
e720: 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61  T":"SCALAR", pPa
e730: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
e740: 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  Id.    );.    sq
e750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
e760: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
e770: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
e780: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
e790: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23  _DYNAMIC);.  }.#
e7a0: 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28  endif..  switch(
e7b0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
e7c0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
e7d0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
e7e0: 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
e7f0: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
e800: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
e810: 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  IN */.      int 
e820: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
e830: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
e840: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
e850: 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
e860: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
e870: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
e880: 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
e890: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
e8a0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
e8b0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
e8c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
e8d0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
e8e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ..      if( rMay
e8f0: 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
e900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e910: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
e920: 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  , 0, rMayHaveNul
e930: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
e940: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
e950: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
e960: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
e970: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
e980: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
e990: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
e9a0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
e9b0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
e9c0: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
e9d0: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
e9e0: 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
e9f0: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
ea00: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
ea10: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
ea20: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
ea30: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
ea40: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
ea50: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
ea60: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
ea70: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
ea80: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
ea90: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
eaa0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
eab0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
eac0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
ead0: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
eae0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
eaf0: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
eb00: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
eb10: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
eb20: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
eb30: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
eb40: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
eb50: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
eb60: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
eb70: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
eb80: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
eb90: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
eba0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
ebb0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
ebc0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
ebd0: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
ebe0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
ebf0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
ec00: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
ec10: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
ec20: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
ec30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
ec40: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
ec50: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ec60: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
ec70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ec80: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
ec90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
eca0: 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
ecb0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
ecc0: 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
ecd0: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
ece0: 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b  arse->db, 1, 1);
ecf0: 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
ed00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ed10: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
ed20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
ed30: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
ed40: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
ed50: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
ed60: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
ed70: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
ed80: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
ed90: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
eda0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
edb0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
edc0: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
edd0: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
ede0: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
edf0: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
ee00: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
ee10: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
ee20: 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
ee30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee40: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
ee50: 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
ee60: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
ee70: 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66          dest.aff
ee80: 53 64 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e  Sdst = (u8)affin
ee90: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
eea0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
eeb0: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
eec0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
eed0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
eee0: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  >x.pSelect->iLim
eef0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
ef00: 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
ef10: 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
ef20: 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
ef30: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
ef40: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  () */.        if
ef50: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
ef60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
ef70: 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29  .pSelect, &dest)
ef80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ef90: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
efa0: 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
efb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
efc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
efd0: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
efe0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
eff0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73  List;.        as
f000: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
f010: 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
f020: 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
f030: 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
f040: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  ) */.        ass
f050: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
f060: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f070: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
f080: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
f090: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
f0a0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
f0b0: 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
f0c0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
f0d0: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
f0e0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
f0f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
f100: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
f150: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
f160: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
f170: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
f180: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
f190: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
f1a0: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
f1b0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
f1c0: 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
f1d0: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
f1e0: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
f1f0: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
f200: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
f210: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
f220: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f230: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
f240: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
f250: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
f260: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
f270: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
f280: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
f290: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
f2a0: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
f2b0: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
f2c0: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
f2d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
f2e0: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
f2f0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
f300: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
f310: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
f320: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
f330: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
f340: 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
f350: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
f360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
f370: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
f380: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
f390: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f3a0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
f3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
f3c0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
f3d0: 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
f3e0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
f3f0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
f400: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
f410: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
f420: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f430: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
f440: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
f450: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
f460: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
f470: 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
f480: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f490: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
f4a0: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
f4b0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f4c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f4d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f4e0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
f4f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
f500: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
f510: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
f520: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
f530: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
f540: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
f550: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
f560: 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
f570: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
f580: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f590: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
f5a0: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
f5b0: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
f5c0: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
f5d0: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
f5e0: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
f5f0: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
f600: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
f610: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
f620: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
f630: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
f640: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
f650: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
f660: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
f670: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
f680: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
f690: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
f6a0: 64 72 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  dr>=0 && !sqlite
f6b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
f6c0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
f6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f6e0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74  hangeToNoop(v, t
f6f0: 65 73 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  estAddr);.      
f700: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
f710: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
f720: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
f730: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
f740: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
f750: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
f760: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
f770: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
f780: 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
f790: 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
f7a0: 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
f7b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f7c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f7d0: 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
f7e0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
f7f0: 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
f800: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f810: 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
f820: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
f830: 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
f840: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
f850: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
f860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f880: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f890: 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f8c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
f8d0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
f8e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
f8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f910: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
f920: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f930: 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
f940: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f950: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f960: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
f970: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
f980: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
f990: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
f9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f9b0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f9c0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
f9d0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
f9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f9f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
fa00: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
fa10: 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
fa20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fa30: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
fa40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
fa50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
fa60: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
fa70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
fa80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
fa90: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
faa0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
fab0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fac0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
fad0: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
fae0: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
faf0: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
fb00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fb10: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
fb20: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
fb30: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
fb40: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
fb50: 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
fb60: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
fb70: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
fb80: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
fb90: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
fba0: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
fbb0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
fbc0: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
fbd0: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
fbe0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
fbf0: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
fc00: 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
fc10: 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
fc20: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
fc30: 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
fc40: 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
fc50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
fc60: 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
fc70: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
fc80: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
fc90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
fca0: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
fcd0: 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
fce0: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
fcf0: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd10: 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
fd20: 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
fd30: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
fd40: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
fd50: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
fd60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
fd70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
fd80: 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
fd90: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
fda0: 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
fdb0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
fdc0: 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
fdd0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
fde0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
fdf0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
fe00: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
fe10: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
fe20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
fe30: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
fe40: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
fe50: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
fe60: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
fe70: 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
fe80: 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
fe90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fea0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
feb0: 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
fec0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
fed0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fee0: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
fef0: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
ff00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ff10: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
ff20: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
ff30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff40: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ff50: 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
ff60: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
ff70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
ff80: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
ff90: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
ffa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
ffb0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
ffc0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
ffd0: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
ffe0: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
fff0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
10000 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
10030 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
10040 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
10050 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
10060 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
10070 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10080 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
10090 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
100a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
100b0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
100c0 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
100d0 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
100e0 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
100f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10100 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
10110 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20 20 20  tAddr>=0 ){.    
10120 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10130 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
10140 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
10150 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
10160 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  se);..  return r
10170 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
10180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
10190 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
101a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
101b0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
101c0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
101d0 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
101e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
101f0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
10200 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
10210 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
10220 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
10230 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
10240 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
10250 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74  sion.  The right
10260 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
10270 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20  .** is an array 
10280 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
10290 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70  values.  The exp
102a0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
102b0 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a  if the LHS is.**
102c0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
102d0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
102e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
102f0 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f  ression is unkno
10300 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20  wn (NULL).** if 
10310 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20  the LHS is NULL 
10320 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  or if the LHS is
10330 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77   not contained w
10340 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e  ithin the RHS an
10350 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e  d the.** RHS con
10360 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
10370 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
10380 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10390 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
103a0 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65   will jump to de
103b0 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
103c0 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
103d0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
103e0 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
103f0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
10400 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
10410 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
10420 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
10430 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
10440 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
10450 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
10460 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
10470 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
10480 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
10490 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
104a0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
104b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
104c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
104d0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
104e0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
104f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
10500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
10510 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
10520 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
10530 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
10540 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
10550 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
10560 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
10570 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
10580 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
10590 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
105a0 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
105b0 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
105c0 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
105d0 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
105e0 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
105f0 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
10600 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
10610 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
10620 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
10630 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20  son affinity to 
10640 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  use */.  int eTy
10650 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
10660 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
10670 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10690 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
106a0 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
106b0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
106c0 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
106d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
106e0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  n */..  /* Compu
106f0 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66  te the RHS.   Af
10700 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74  ter this step, t
10710 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10720 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d  rsor.  ** pExpr-
10730 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e  >iTable will con
10740 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
10750 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
10760 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20  e RHS..  */.  v 
10770 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10780 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10790 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
107a0 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
107b0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
107c0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
107d0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
107e0 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
107f0 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
10800 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
10810 70 45 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e  pExpr, &rRhsHasN
10820 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ull);..  /* Figu
10830 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
10840 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
10850 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
10860 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
10870 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
10880 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
10890 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
108a0 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
108b0 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f  for.  ** P4 of O
108c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
108d0 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20  */.  affinity = 
108e0 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
108f0 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  ty(pExpr);..  /*
10900 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
10910 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
10920 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
10930 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
10940 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
10950 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71  arse);.  r1 = sq
10960 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10970 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
10980 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10990 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
109a0 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   r1);..  /* If t
109b0 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20  he LHS is NULL, 
109c0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
109d0 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20  is either false 
109e0 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e  or NULL dependin
109f0 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65  g.  ** on whethe
10a00 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
10a10 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
10a20 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ctively..  */.  
10a30 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
10a40 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
10a50 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66     /* Shortcut f
10a60 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
10a70 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c  se where the fal
10a80 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63  se and NULL outc
10a90 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  omes are.    ** 
10aa0 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20  the same. */.   
10ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ac0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
10ad0 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
10ae0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10af0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10b00 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
10b10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10b20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29   OP_NotNull, r1)
10b30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
10b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10b50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
10b60 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  ewind, pExpr->iT
10b70 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
10b80 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  e);.    VdbeCove
10b90 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
10ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10bb0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
10bc0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  stIfNull);.    s
10bd0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10be0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
10bf0 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  }..  if( eType==
10c00 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29  IN_INDEX_ROWID )
10c10 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
10c20 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
10c30 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
10c40 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20  able b-tree.    
10c50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10c60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
10c70 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65  ustBeInt, r1, de
10c80 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65  stIfFalse); Vdbe
10c90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10ca0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10cb0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
10cc0 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
10cd0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
10ce0 72 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  r1);.    VdbeCov
10cf0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
10d00 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  e{.    /* In thi
10d10 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
10d20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  is an index b-tr
10d30 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ee..    */.    s
10d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10d50 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
10d60 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69   r1, 1, 0, &affi
10d70 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  nity, 1);..    /
10d80 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d  * If the set mem
10d90 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69  bership test fai
10da0 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ls, then the res
10db0 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20  ult of the .    
10dc0 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20  ** "x IN (...)" 
10dd0 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
10de0 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e  be either 0 or N
10df0 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a  ULL. If the set.
10e00 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
10e10 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
10e20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10e30 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
10e40 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
10e50 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
10e60 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
10e70 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10e80 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  e.    ** express
10e90 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ion is also NULL
10ea0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10eb0 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
10ec0 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d  || destIfFalse==
10ed0 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  destIfNull ){.  
10ee0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
10ef0 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
10f00 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
10f10 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20  e time that the 
10f20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  RHS.      ** can
10f30 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  not contain NULL
10f40 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61   values. This ha
10f50 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73  ppens as the res
10f60 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ult.      ** of 
10f70 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  a "NOT NULL" con
10f80 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64  straint in the d
10f90 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
10fa0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10fb0 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
10fc0 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
10fd0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
10fe0 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66  FALSE.      ** f
10ff0 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  or this particul
11000 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ar IN operator..
11010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
11020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11030 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
11040 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
11050 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
11060 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64  r1, 1);.      Vd
11070 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11090 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63  /* In this branc
110a0 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  h, the RHS of th
110b0 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61  e IN might conta
110c0 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  in a NULL and.  
110d0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
110e0 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
110f0 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
11100 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
11110 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  he.      ** outc
11120 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ome..      */.  
11130 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
11140 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  .      /* First 
11150 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
11160 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
11170 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
11180 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a    If so,.      *
11190 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65 73 65  * then the prese
111a0 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
111b0 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74  the RHS does not
111c0 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70   matter, so jump
111d0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61  .      ** over a
111e0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74  ll of the code t
111f0 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20  hat follows..   
11200 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d     */.      j1 =
11210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11220 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
11230 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
11240 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  , 0, r1, 1);.   
11250 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11260 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65  v);..      /* He
11270 72 65 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65  re we begin gene
11280 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74  rating code that
11290 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53   runs if the LHS
112a0 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   is not.      **
112b0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
112c0 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65  n the RHS.  Gene
112d0 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  rate additional 
112e0 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 20 20  code that.      
112f0 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52 48 53  ** tests the RHS
11300 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20   for NULLs.  If 
11310 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
11320 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20   a NULL then.   
11330 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65     ** jump to de
11340 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
11350 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73  ere are no NULLs
11360 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
11370 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  .      ** jump t
11380 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20  o destIfFalse.. 
11390 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
113a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
113b0 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61  v, OP_If, rRhsHa
113c0 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
113d0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
113e0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
113f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11400 4f 50 5f 49 66 4e 6f 74 2c 20 72 52 68 73 48 61  OP_IfNot, rRhsHa
11410 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c  sNull, destIfFal
11420 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
11430 65 28 76 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d  e(v);.      j2 =
11440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11450 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
11460 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
11470 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
11480 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
11490 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
114a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
114c0 65 72 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75  er, 0, rRhsHasNu
114d0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
114e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
114f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
11500 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
11510 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11520 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20  ere(v, j2);.    
11530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11540 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11550 72 2c 20 31 2c 20 72 52 68 73 48 61 73 4e 75 6c  r, 1, rRhsHasNul
11560 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
11570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11580 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
11590 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 2f  fNull);..      /
115a0 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61  * The OP_Found a
115b0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
115c0 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68  s branch jumps h
115d0 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a  ere when true, .
115e0 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67        ** causing
115f0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20   the overall IN 
11600 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
11610 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68  ation to fall th
11620 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  rough..      */.
11630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11640 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
11650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11660 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11670 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11680 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
11690 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
116a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
116b0 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
116c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
116d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
116e0 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75  ERY */../*.** Du
116f0 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74  plicate an 8-byt
11700 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
11710 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65  c char *dup8byte
11720 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  s(Vdbe *v, const
11730 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68   char *in){.  ch
11740 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65  ar *out = sqlite
11750 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
11760 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38  ite3VdbeDb(v), 8
11770 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
11780 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20      memcpy(out, 
11790 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65  in, 8);.  }.  re
117a0 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66  turn out;.}..#if
117b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
117c0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
117d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
117e0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
117f0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
11800 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
11810 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
11820 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
11830 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
11840 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
11850 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
11860 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
11870 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
11880 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
11890 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
118a0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
118b0 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
118c0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
118d0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
118e0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
118f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
11900 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
11910 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
11920 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
11930 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
11940 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
11950 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
11960 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
11970 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  zV;.    sqlite3A
11980 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
11990 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
119a0 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
119b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
119c0 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
119d0 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
119e0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
119f0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
11a00 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
11a10 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
11a20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
11a30 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
11a40 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
11a50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11a60 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
11a70 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b  0, zV, P4_REAL);
11a80 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
11a90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
11aa0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
11ab0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
11ac0 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
11ad0 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
11ae0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
11af0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
11b00 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
11b10 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
11b20 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
11b30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b40 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
11b50 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
11b60 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
11b70 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
11b80 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
11b90 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
11ba0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
11bb0 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
11bc0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
11bd0 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
11be0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
11bf0 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
11c00 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
11c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11c20 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11c30 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
11c40 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
11c50 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
11c60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
11c70 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
11c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
11c90 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
11ca0 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26  lite3Atoi64(z, &
11cb0 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
11cc0 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
11cd0 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66 28  E_UTF8);.    if(
11ce0 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
11cf0 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
11d00 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
11d10 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
11d20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
11d30 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
11d40 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
11d50 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
11d60 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
11d70 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
11d80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11d90 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
11da0 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54  m, 0, zV, P4_INT
11db0 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
11dc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11dd0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
11de0 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
11df0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11e00 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
11e10 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
11e20 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
11e30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 63  );.#else.      c
11e40 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
11e50 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23 65  gFlag, iMem);.#e
11e60 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
11e70 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  ../*.** Clear a 
11e80 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  cache entry..*/.
11e90 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
11ea0 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
11eb0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
11ec0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b  t yColCache *p){
11ed0 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65  .  if( p->tempRe
11ee0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  g ){.    if( pPa
11ef0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
11f00 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
11f10 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
11f20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
11f30 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
11f40 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65  pReg++] = p->iRe
11f50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  g;.    }.    p->
11f60 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d  tempReg = 0;.  }
11f70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .}.../*.** Recor
11f80 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
11f90 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72  cache that a par
11fa0 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66  ticular column f
11fb0 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75  rom a.** particu
11fc0 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f  lar table is sto
11fd0 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  red in a particu
11fe0 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  lar register..*/
11ff0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
12000 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73  rCacheStore(Pars
12010 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
12020 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
12030 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
12040 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b  i;.  int minLru;
12050 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20  .  int idxLru;. 
12060 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
12070 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *p;..  assert(
12080 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52   iReg>0 );  /* R
12090 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
120a0 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74  are always posit
120b0 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ive */.  assert(
120c0 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f   iCol>=-1 && iCo
120d0 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46  l<32768 );  /* F
120e0 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  inite column num
120f0 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  bers */..  /* Th
12100 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  e SQLITE_ColumnC
12110 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c  ache flag disabl
12120 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  es the column ca
12130 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  che.  This is us
12140 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74  ed.  ** for test
12150 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65  ing only - to ve
12160 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65  rify that SQLite
12170 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65   always gets the
12180 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a   same answer.  *
12190 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f  * with and witho
121a0 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ut the column ca
121b0 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
121c0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
121d0 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
121e0 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
121f0 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  che) ) return;..
12200 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
12210 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
12220 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
12230 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77   Actually, the w
12240 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ay the column ca
12250 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  che is currently
12260 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75   used, we are gu
12270 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68  aranteed.  ** th
12280 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69  at the object wi
12290 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79  ll never already
122a0 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56   be in cache.  V
122b0 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61  erify this guara
122c0 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ntee..  */.#ifnd
122d0 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28  ef NDEBUG.  for(
122e0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
122f0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12300 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
12310 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, p++){.    as
12320 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
12330 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
12340 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
12350 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
12360 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
12370 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
12380 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
12390 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
123a0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
123b0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
123c0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
123d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
123e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
123f0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
12400 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
12410 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
12420 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
12430 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
12440 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
12450 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
12460 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
12470 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
12480 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
12490 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
124a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
124b0 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
124c0 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
124d0 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
124e0 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
124f0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
12500 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12510 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
12520 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
12530 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
12540 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
12550 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
12560 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
12570 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
12580 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
12590 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
125a0 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
125b0 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
125c0 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
125d0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
125e0 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
125f0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
12600 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
12610 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
12620 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
12630 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
12640 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
12650 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
12660 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
12670 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
12680 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
12690 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
126a0 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
126b0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
126c0 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
126d0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
126e0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
126f0 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
12700 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
12710 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
12720 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
12730 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
12740 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69  .  int iLast = i
12750 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a  Reg + nReg - 1;.
12760 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
12770 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
12780 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
12790 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
127a0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
127b0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
127c0 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
127d0 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72  if( r>=iReg && r
127e0 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
127f0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
12800 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
12810 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
12820 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12830 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
12840 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
12850 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
12860 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
12870 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
12880 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
12890 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
128a0 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
128b0 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
128c0 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
128d0 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
128e0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
128f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
12900 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
12910 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66  eLevel++;.#ifdef
12920 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
12930 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
12940 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
12950 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
12960 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53  .    printf("PUS
12970 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72  H to %d\n", pPar
12980 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
12990 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
129a0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f  /*.** Remove fro
129b0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
129c0 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  he any entries t
129d0 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73  hat were added s
129e0 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20  ince the.** the 
129f0 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33  previous sqlite3
12a00 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70  ExprCachePush op
12a10 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  eration.  In oth
12a20 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
12a30 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74  e.** the cache t
12a40 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
12a50 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20  as in prior the 
12a60 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68  most recent Push
12a70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12a80 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61  3ExprCachePop(Pa
12a90 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
12aa0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
12ab0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
12ac0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12ad0 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29  iCacheLevel>=1 )
12ae0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
12af0 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65  heLevel--;.#ifde
12b00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
12b10 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
12b20 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
12b30 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
12b40 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f  {.    printf("PO
12b50 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  P  to %d\n", pPa
12b60 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
12b70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12b80 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
12b90 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
12ba0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
12bb0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
12bc0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
12bd0 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
12be0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
12bf0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
12c00 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
12c10 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
12c20 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
12c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
12c40 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
12c50 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
12c60 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
12c70 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
12c80 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
12c90 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
12ca0 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
12cb0 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
12cc0 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
12cd0 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
12ce0 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
12cf0 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
12d00 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
12d10 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
12d20 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
12d30 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
12d40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12d50 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
12d60 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
12d70 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
12d80 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
12d90 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
12da0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
12db0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
12dc0 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
12dd0 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
12de0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
12df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
12e00 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
12e10 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
12e20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
12e30 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
12e40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
12e50 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
12e60 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
12e70 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
12e80 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
12e90 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
12ea0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
12eb0 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
12ec0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
12ed0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
12ee0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
12ef0 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
12f00 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
12f10 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
12f20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
12f30 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12f40 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
12f50 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
12f60 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
12f70 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
12f80 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
12f90 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43  r */.){.  if( iC
12fa0 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
12fb0 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
12fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fd0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
12fe0 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
12ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
13000 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
13010 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
13020 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
13030 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43  ;.    int x = iC
13040 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73  ol;.    if( !Has
13050 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
13060 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
13070 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71  ColumnOfIndex(sq
13080 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
13090 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c  ndex(pTab), iCol
130a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
130b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
130c0 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78  , op, iTabCur, x
130d0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
130e0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
130f0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
13100 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
13110 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
13120 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
13130 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
13140 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
13150 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
13160 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
13170 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
13180 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
13190 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
131a0 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
131b0 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
131c0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
131d0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
131e0 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
131f0 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
13200 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
13210 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
13220 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
13230 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
13240 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
13250 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
13260 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
13270 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
13280 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
13290 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
132a0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
132b0 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
132c0 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
132d0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
132e0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
132f0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
13300 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
13310 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
13320 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
13330 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
13340 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
13350 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
13360 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
13370 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
13380 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
13390 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
133a0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
133b0 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
133c0 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
133d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
133e0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
133f0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
13400 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
13410 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
13420 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f  for OP_Column */
13430 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
13440 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
13450 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
13460 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
13470 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
13480 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
13490 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
134a0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
134b0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
134c0 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
134d0 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
134e0 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
134f0 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
13500 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
13510 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
13520 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
13530 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
13540 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
13550 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
13560 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
13570 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
13580 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
13590 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
135a0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
135b0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
135c0 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
135d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
135e0 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
135f0 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
13600 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
13610 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
13620 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
13630 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
13640 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
13650 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
13660 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
13670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13680 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
13690 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
136a0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
136b0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66  olCache *p;..#if
136c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
136d0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
136e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
136f0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
13700 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45  .    printf("CLE
13710 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  AR\n");.  }.#end
13720 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
13730 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13740 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13750 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13760 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13770 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
13780 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
13790 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
137a0 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
137b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
137c0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
137d0 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
137e0 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
137f0 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
13800 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
13810 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
13820 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13830 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
13840 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
13850 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
13860 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
13870 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13880 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
13890 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b  iStart, iCount);
138a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
138b0 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
138c0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
138d0 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
138e0 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
138f0 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
13900 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65  nReg-1. Keep the
13910 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
13920 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
13930 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
13940 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
13950 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
13960 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
13970 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
13980 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
13990 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 46  *p;.  assert( iF
139a0 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c  rom>=iTo+nReg ||
139b0 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f   iFrom+nReg<=iTo
139c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
139d0 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e  eAddOp3(pParse->
139e0 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
139f0 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67  iFrom, iTo, nReg
13a00 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  );.  for(i=0, p=
13a10 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13a20 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13a30 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13a40 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
13a50 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
13a60 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46  x>=iFrom && x<iF
13a70 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20  rom+nReg ){.    
13a80 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f    p->iReg += iTo
13a90 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20  -iFrom;.    }.  
13aa0 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
13ab0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
13ac0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
13ad0 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a  _COVERAGE_TEST).
13ae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
13af0 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
13b00 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
13b10 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
13b20 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
13b30 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
13b40 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a  column cache..**
13b50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13b60 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
13b70 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73  assert() and tes
13b80 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f  tcase() macros o
13b90 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  nly.** and does 
13ba0 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20  not appear in a 
13bb0 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f  normal build..*/
13bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
13bd0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
13be0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
13bf0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
13c00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
13c10 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
13c20 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
13c30 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13c40 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
13c50 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13c60 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
13c70 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
13c80 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
13c90 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20  o ) return 1;   
13ca0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d   /*NO_TEST*/.  }
13cb0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
13cc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13cd0 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f  DEBUG || SQLITE_
13ce0 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
13cf0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
13d00 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
13d10 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
13d20 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  TER.*/.static vo
13d30 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  id exprToRegiste
13d40 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
13d50 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d  Reg){.  p->op2 =
13d60 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20   p->op;.  p->op 
13d70 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
13d80 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65   p->iTable = iRe
13d90 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72  g;.  ExprClearPr
13da0 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69  operty(p, EP_Ski
13db0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  p);.}../*.** Gen
13dc0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
13dd0 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
13de0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
13df0 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
13e00 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
13e10 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
13e20 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
13e30 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
13e40 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
13e50 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
13e60 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
13e70 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
13e80 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
13e90 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
13ea0 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
13eb0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
13ec0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
13ed0 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
13ee0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
13ef0 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
13f00 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
13f10 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
13f20 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
13f30 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
13f40 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
13f50 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
13f60 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
13f70 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
13f80 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
13f90 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
13fa0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13fb0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
13fc0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
13fd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
13fe0 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
13ff0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
14000 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
14010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14020 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
14030 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
14040 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
14050 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
14060 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
14070 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
14080 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
14090 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
140a0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
140b0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
140c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
140d0 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
140e0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
140f0 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
14100 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
14110 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
14120 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
14130 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
14140 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
14150 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
14160 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
14170 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14180 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  on */.  Expr tem
14190 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
141a0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
141b0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
141c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  /..  assert( tar
141d0 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
141e0 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
141f0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
14200 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
14210 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
14220 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
14230 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
14240 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
14250 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
14260 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
14270 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
14280 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
14290 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
142a0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
142b0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
142c0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
142d0 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
142e0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
142f0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
14300 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
14310 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
14320 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
14330 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
14340 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
14350 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
14360 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Reg = pCol->iMem
14370 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14380 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14390 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
143a0 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
143b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
143c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
143d0 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
143e0 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
14410 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
14420 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14440 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
14450 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
14460 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
14470 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
14480 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
14490 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
144a0 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54  iTab = pExpr->iT
144b0 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20  able;.      if( 
144c0 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
144d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b    if( pParse->ck
144e0 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Base>0 ){.      
144f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
14500 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
14510 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
14520 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
14530 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
14540 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
14550 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
14560 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
14570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14590 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20      /* Deleting 
145a0 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69  from a partial i
145b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
145c0 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
145d0 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20  >iPartIdxTab;.  
145e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
145f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
14600 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
14610 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
14620 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14650 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
14660 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
14690 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p2);.      break
146a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
146b0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
146c0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
146d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
146e0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
146f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
14700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14710 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
14720 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
14730 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
14740 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
14750 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
14760 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
14770 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
14780 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
14790 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
147a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
147b0 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
147c0 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
147d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
147e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
147f0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
14800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14810 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14820 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
14830 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
14840 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
14850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14860 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
14870 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14890 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
148a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
148b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
148c0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
148d0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
148e0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
148f0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
14900 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
14910 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
14920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
14930 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14940 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
14950 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
14960 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
14970 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
14980 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
14990 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
149a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
149b0 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
149c0 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
149d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
149e0 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
149f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
14a00 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
14a10 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
14a20 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
14a30 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
14a40 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
14a50 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
14a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14a70 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
14a80 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
14a90 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
14aa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14ab0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
14ac0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
14ad0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
14ae0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
14af0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
14b00 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
14b10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
14b20 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
14b30 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
14b40 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
14b50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b70 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
14b80 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
14b90 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
14ba0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
14bb0 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
14bc0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
14bd0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
14be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
14bf0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
14c00 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
14c10 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
14c20 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
14c30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14c40 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
14c50 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
14c60 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
14c70 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
14c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14c90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14ca0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
14cb0 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
14cc0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
14cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ce0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
14cf0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
14d00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14d10 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
14d20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
14d30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
14d40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
14d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
14d60 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
14d70 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
14d80 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
14d90 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
14da0 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
14db0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
14dc0 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
14dd0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
14de0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
14df0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14e00 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
14e10 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
14e20 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14e30 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
14e40 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
14e50 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
14e60 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
14e70 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f  en, 0);.      to
14e80 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
14e90 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
14ea0 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
14eb0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14ec0 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
14ed0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
14ee0 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
14ef0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14f00 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
14f10 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
14f20 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
14f30 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14f40 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
14f50 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
14f60 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
14f70 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14f80 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
14f90 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
14fa0 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
14fb0 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
14fc0 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
14fd0 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
14fe0 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74  AL    );.      t
14ff0 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
15000 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20  OP_ToText );.   
15010 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
15020 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b  op==OP_ToBlob );
15030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15040 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
15050 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65  eric );.      te
15060 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
15070 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20  P_ToInt );.     
15080 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
15090 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20  ==OP_ToReal );. 
150a0 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
150b0 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
150c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
150d0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
150e0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
150f0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
15100 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
15110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15120 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
15130 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
15140 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
15150 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
15160 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
15170 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
15180 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
15190 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
151a0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
151b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
151c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
151d0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
151e0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
151f0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
15200 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
15210 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
15220 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
15230 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
15240 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15250 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15260 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15270 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
15280 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15290 45 78 70 72 55 73 65 73 52 69 67 68 74 28 70 45  ExprUsesRight(pE
152a0 78 70 72 29 20 29 3b 0a 20 20 20 20 20 20 72 32  xpr) );.      r2
152b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
152c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
152d0 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20  Expr->x.pRight, 
152e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
152f0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
15300 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15310 66 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69  ft, pExpr->x.pRi
15320 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
15330 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
15340 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
15350 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
15360 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
15370 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
15380 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
15390 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
153a0 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
153b0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
153c0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
153d0 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
153e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
153f0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
15400 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
15410 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
15420 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
15430 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
15440 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
15450 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
15460 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
15470 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
15480 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
15490 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
154a0 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
154b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
154c0 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
154d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
154e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
154f0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
15500 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
15510 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
15520 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
15530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15540 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15560 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15580 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
15590 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
155a0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
155b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
155c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
155d0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
155e0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
155f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15600 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15610 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
15620 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15630 20 45 78 70 72 55 73 65 73 52 69 67 68 74 28 70   ExprUsesRight(p
15640 45 78 70 72 29 20 29 3b 0a 20 20 20 20 20 20 72  Expr) );.      r
15650 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15660 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15670 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c  pExpr->x.pRight,
15680 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
15690 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
156a0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
156b0 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
156c0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
156d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
156e0 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 6f 70  pr->x.pRight, op
156f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15700 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
15710 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
15720 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  2 | SQLITE_NULLE
15730 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
15740 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
15750 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64  TK_EQ);.      Vd
15760 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
15770 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20  op==TK_NE);.    
15780 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15790 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
157a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
157b0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
157c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
157d0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
157e0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
157f0 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
15800 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
15810 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
15820 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
15830 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
15840 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
15850 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
15860 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
15870 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
15880 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
15890 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
158a0 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
158b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
158c0 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20  AND==OP_And );  
158d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
158e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
158f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15900 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20  TK_OR==OP_Or ); 
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
15920 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
15930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15940 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
15950 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74  d );           t
15960 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15970 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  PLUS );.      as
15980 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
15990 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20  OP_Subtract );  
159a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
159b0 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
159c0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
159d0 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
159e0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
159f0 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a  ( op==TK_REM );.
15a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15a10 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41  _BITAND==OP_BitA
15a20 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  nd );      testc
15a30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
15a40 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
15a50 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50  rt( TK_BITOR==OP
15a60 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20  _BitOr );       
15a70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15a80 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
15a90 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
15aa0 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20  H==OP_Divide ); 
15ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15ac0 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
15ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15ae0 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
15af0 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63  tLeft );   testc
15b00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
15b10 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
15b20 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
15b30 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20  P_ShiftRight ); 
15b40 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15b50 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
15b60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
15b70 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
15b80 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
15b90 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
15ba0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
15bb0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15bc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15bd0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
15be0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15bf0 20 45 78 70 72 55 73 65 73 52 69 67 68 74 28 70   ExprUsesRight(p
15c00 45 78 70 72 29 20 29 3b 0a 20 20 20 20 20 20 72  Expr) );.      r
15c10 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15c20 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15c30 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c  pExpr->x.pRight,
15c40 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
15c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15c60 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
15c70 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
15c80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
15c90 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
15ca0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15cb0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
15cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15cd0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
15ce0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
15cf0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
15d00 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
15d10 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
15d20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
15d30 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
15d40 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
15d50 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
15d60 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
15d70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15d80 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
15d90 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
15da0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
15db0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
15dc0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15dd0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15de0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
15df0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
15e00 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
15e10 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
15e20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
15e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
15e40 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
15e50 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
15e60 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
15e70 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
15e80 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
15e90 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
15ea0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
15eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15ec0 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
15ed0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15ee0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15ef0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15f00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15f10 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
15f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15f30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15f40 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
15f50 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
15f60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15f70 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
15f80 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
15f90 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
15fa0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15fb0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
15fc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
15fd0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
15fe0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
15ff0 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
16000 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
16010 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
16020 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
16030 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
16040 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16050 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
16060 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16070 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16080 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16090 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
160a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
160b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
160c0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
160d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
160e0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
160f0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
16100 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16110 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
16120 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
16130 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
16140 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
16150 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
16160 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
16170 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16180 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
16190 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
161a0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
161b0 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
161c0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
161d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
161e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
161f0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
16200 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
16210 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16220 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16230 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16240 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16250 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
16260 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
16270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16280 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
16290 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
162a0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
162b0 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
162c0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
162d0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
162e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
162f0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
16300 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a  m, target, -1);.
16310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16320 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
16330 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
16340 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16350 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
16360 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
16370 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
16380 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
16390 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
163a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
163b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
163c0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
163d0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
163e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
163f0 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
16400 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
16410 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
16420 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
16430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
16440 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
16450 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
16460 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
16470 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16480 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
16490 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
164a0 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
164b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
164c0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
164d0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
164e0 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
164f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16500 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
16510 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
16520 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
16530 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
16540 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
16550 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
16560 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
16570 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
16580 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
16590 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
165a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
165b0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
165c0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
165d0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
165e0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
165f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
16600 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
16610 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
16620 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
16630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16640 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16650 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
16660 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
16670 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
16680 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
16690 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
166a0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
166b0 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
166c0 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
166d0 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ence */..      i
166e0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
166f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
16700 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
16710 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
16720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16730 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
16740 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16750 2c 20 45 50 5f 78 49 73 4c 69 73 74 29 20 29 3b  , EP_xIsList) );
16760 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
16770 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
16780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
16790 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
167a0 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
167b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
167c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
167d0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
167e0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
167f0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
16800 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  en;.      nId = 
16810 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16820 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  zId);.      pDef
16830 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
16840 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
16850 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  nId, nFarg, enc,
16860 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
16870 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
16880 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16890 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
168a0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  wn function: %.*
168b0 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  s()", nId, zId);
168c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
168d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
168e0 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
168f0 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
16900 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
16910 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
16920 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
16930 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
16940 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
16950 65 73 73 61 72 79 20 65 76 61 6c 61 74 69 6f 6e  essary evalation
16960 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
16970 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
16980 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
16990 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
169a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
169b0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
169c0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
169d0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
169e0 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
169f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16a00 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
16a10 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
16a20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
16a30 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
16a40 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
16a50 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
16a60 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
16a70 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
16a80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16aa0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
16ab0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
16ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
16ad0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16af0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
16b00 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
16b10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16b20 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
16b30 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
16b40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16b50 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
16b60 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
16b70 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
16b80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16b90 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
16ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16bb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16bc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
16bd0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
16be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16bf0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
16c00 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
16c10 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
16c20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
16c30 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
16c40 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
16c50 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
16c60 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
16c70 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
16c80 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
16c90 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
16ca0 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
16cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16cc0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
16cd0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
16ce0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
16cf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16d00 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
16d10 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
16d20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
16d30 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
16d40 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
16d50 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
16d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
16d70 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
16d80 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
16d90 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
16da0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
16db0 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
16dc0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
16dd0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
16de0 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
16df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
16e00 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
16e10 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
16e20 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
16e30 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
16e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16e50 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
16e60 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
16e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
16e80 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
16e90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
16ea0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
16eb0 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
16ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
16ed0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16ee0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
16ef0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
16f00 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16f10 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
16f20 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
16f30 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
16f40 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
16f50 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
16f60 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
16f70 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
16f80 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
16f90 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
16fa0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
16fb0 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
16fc0 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
16fd0 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
16fe0 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
16ff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17000 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
17010 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
17020 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
17030 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
17040 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
17050 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
17060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
17070 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
17080 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
17090 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
170a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
170b0 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
170c0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
170d0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
170e0 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
170f0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
17100 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
17110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
17120 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
17130 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
17140 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
17150 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
17160 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
17170 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
17180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
17190 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
171a0 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
171b0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
171c0 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
171d0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
171e0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
171f0 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
17200 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
17210 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
17220 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
17230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17240 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
17250 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
17260 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
17270 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
17280 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
17290 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
172a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
172b0 70 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20 20  pFarg, r1,.     
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
172e0 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
172f0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
17300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17310 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
17320 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
17330 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
17340 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
17350 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
17360 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
17370 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
17380 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
17390 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
173a0 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
173b0 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
173c0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
173d0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
173e0 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
173f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
17400 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
17410 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
17420 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
17430 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
17440 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
17450 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
17460 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
17470 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
17480 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
17490 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
174a0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
174b0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
174c0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
174d0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
174e0 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
174f0 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
17500 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
17510 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
17520 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
17530 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
17540 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
17550 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
17560 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
17570 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
17580 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
17590 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
175a0 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
175b0 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
175c0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
175d0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
175e0 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
175f0 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
17600 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
17610 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
17620 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
17630 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
17640 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
17650 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
17660 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
17670 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
17680 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
17690 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
176a0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
176b0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
176c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
176d0 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
176e0 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
176f0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
17700 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
17710 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
17720 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
17730 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
17740 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
17750 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
17760 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
17770 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
17780 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
17790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
177a0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
177b0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
177c0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
177d0 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
177e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
177f0 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
17800 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
17810 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
17840 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
17850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
17860 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
17870 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
17880 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
17890 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
178a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
178b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
178c0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
178d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
178e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
178f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17900 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
17910 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
17920 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
17930 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17940 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
17950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17960 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
17970 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
17980 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
17990 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
179a0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
179b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
179c0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
179d0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
179e0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
179f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17a00 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
17a10 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
17a20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
17a50 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
17a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17a70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
17a80 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
17a90 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
17aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17ac0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
17ad0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17ae0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17af0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
17b00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17b10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17b20 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
17b30 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
17b40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17b50 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
17b60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17b70 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
17b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17b90 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
17ba0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
17bb0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
17bc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
17bd0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
17be0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
17bf0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
17c00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
17c10 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
17c20 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
17c30 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
17c40 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17c50 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
17c60 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
17c70 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
17c80 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
17c90 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
17ca0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
17cb0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
17cc0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
17cd0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17ce0 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
17cf0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
17d00 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
17d10 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
17d20 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
17d30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17d40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17d50 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
17d60 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
17d70 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17d80 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
17d90 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17da0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17db0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17dc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17dd0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17de0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
17df0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17e00 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
17e10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17e20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
17e30 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
17e40 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
17e50 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
17e60 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
17e70 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
17e80 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72  EP2);  VdbeCover
17e90 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c  age(v);.      pL
17ea0 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
17eb0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
17ec0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
17ed0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
17ee0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
17ef0 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
17f00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17f10 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
17f20 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
17f30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17f40 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
17f50 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
17f60 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
17f70 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
17f80 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
17f90 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
17fa0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
17fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17fc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17fd0 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
17fe0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
17ff0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18000 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
18010 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
18020 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18030 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
18040 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18050 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
18060 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
18070 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
18080 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
18090 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
180a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
180b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
180c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
180d0 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
180e0 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
180f0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
18100 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
18110 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
18120 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
18130 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
18140 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
18150 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
18160 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
18170 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
18180 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
18190 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
181a0 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
181b0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
181c0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
181d0 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
181e0 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
181f0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
18200 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
18210 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
18220 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
18230 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
18240 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
18250 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
18260 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
18270 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
18280 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
18290 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
182a0 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
182b0 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
182c0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
182d0 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
182e0 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
182f0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
18300 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
18310 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
18320 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
18330 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
18340 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
18350 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
18360 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
18370 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
18380 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
18390 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
183a0 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
183b0 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
183c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
183d0 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
183e0 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
183f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
18400 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
18410 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
18420 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
18430 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
18440 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
18450 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
18460 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
18470 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
18480 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
18490 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
184a0 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
184b0 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
184c0 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
184d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
184e0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
184f0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
18500 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18510 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
18520 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
18530 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18540 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
18550 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
18560 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
18570 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
18580 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
18590 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
185a0 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
185b0 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
185c0 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
185d0 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
185e0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
185f0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
18600 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
18610 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
18620 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
18630 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
18640 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
18650 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
18660 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
18670 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
18680 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
18690 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
186a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
186b0 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
186c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
186d0 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
186e0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
186f0 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
18700 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
18710 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
18720 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
18730 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
18740 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
18750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18760 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
18770 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
18780 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18790 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
187a0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
187b0 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
187c0 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
187d0 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
187e0 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
187f0 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
18800 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
18810 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
18820 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
18830 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
18840 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
18850 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
18860 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
18870 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
18880 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
18890 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
188a0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
188b0 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
188c0 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
188d0 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
188e0 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   real.  */.     
188f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
18900 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
18910 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
18920 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
18930 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
18940 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
18950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18960 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18970 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
18980 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
18990 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
189a0 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
189b0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
189c0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
189d0 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
189e0 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
189f0 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
18a00 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
18a10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
18a20 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
18a30 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
18a40 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
18a50 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
18a60 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
18a70 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
18a80 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
18a90 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
18aa0 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
18ab0 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
18ac0 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
18ad0 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
18ae0 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
18af0 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
18b00 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
18b10 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
18b20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
18b30 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
18b40 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
18b50 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
18b60 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
18b70 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
18b80 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
18b90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
18ba0 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
18bb0 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
18bc0 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
18bd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
18be0 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
18bf0 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
18c00 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
18c10 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
18c20 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
18c30 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
18c40 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
18c50 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
18c60 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
18c70 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
18c80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18c90 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
18ca0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
18cb0 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
18cc0 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
18cd0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
18ce0 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
18cf0 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
18d00 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
18d10 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
18d20 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
18d30 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
18d40 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
18d50 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
18d60 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
18d90 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
18da0 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
18db0 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
18de0 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
18df0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
18e00 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
18e30 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
18e40 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18e70 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
18e80 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
18e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18ea0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
18eb0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
18ec0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
18ed0 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
18ee0 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
18ef0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
18f00 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
18f10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18f20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
18f30 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
18f40 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
18f70 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
18f80 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
18f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18fa0 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
18fb0 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
18fc0 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
18fd0 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
18fe0 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
18ff0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
19000 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
19010 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
19020 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
19030 50 5f 78 49 73 4c 69 73 74 29 20 26 26 20 70 45  P_xIsList) && pE
19040 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
19050 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
19060 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
19070 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
19080 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
19090 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
190a0 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
190b0 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
190c0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
190d0 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
190e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
190f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
19100 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
19110 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
19120 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20          tempX = 
19130 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73  *pX;.        tes
19140 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
19150 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
19160 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74      exprToRegist
19170 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74  er(&tempX, sqlit
19180 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
19190 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
191a0 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
191b0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
191c0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
191d0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
191e0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
191f0 70 43 6f 6d 70 61 72 65 2e 66 6c 61 67 73 20 3d  pCompare.flags =
19200 20 30 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f   0;.        opCo
19210 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74  mpare.pLeft = &t
19220 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54  empX;.        pT
19230 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
19240 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63  ;.        /* Tic
19250 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35  ket b351d95f9cd5
19260 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35  ef17e9d9dbae18f5
19270 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20  ca8611190001:.  
19280 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c        ** The val
19290 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d  ue in regFree1 m
192a0 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65  ight get SCopy-e
192b0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  d into the file 
192c0 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20  result..        
192d0 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** So make sure 
192e0 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65  that the regFree
192f0 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  1 register is no
19300 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68  t reused for oth
19310 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75  er.        ** pu
19320 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69  rposes and possi
19330 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  bly overwritten.
19340 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67    */.        reg
19350 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20  Free1 = 0;.     
19360 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
19370 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69  ; i<nExpr-1; i=i
19380 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
19390 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
193a0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
193b0 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
193c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
193d0 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
193e0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 78       opCompare.x
193f0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
19400 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
19410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19420 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
19430 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
19440 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
19450 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
19460 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19470 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
19480 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
19490 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
194a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
194b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
194c0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
194d0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
194e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
194f0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
19500 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
19510 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
19520 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
19530 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
19540 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
19550 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
19560 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19580 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c  OP_Goto, 0, endL
19590 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
195a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
195b0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
195c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
195d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
195e0 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
195f0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
19600 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
19610 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19620 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
19630 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19640 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
19650 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
19660 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
19670 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
19680 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
19690 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
196a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
196b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
196c0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
196d0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
196e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
196f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19700 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
19710 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
19720 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
19730 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
19740 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
19750 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19760 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
19770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19780 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
19790 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
197a0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
197b0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
197c0 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
197d0 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
197e0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
197f0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
19800 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
19810 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
19820 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
19830 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
19840 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
19850 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
19860 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
19870 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
19880 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19890 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
198a0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
198b0 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
198c0 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
198d0 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
198e0 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
198f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19900 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
19910 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
19920 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
19930 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19940 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
19950 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19960 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
19970 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
19980 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
19990 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
199a0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
199b0 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
199c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
199d0 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
199e0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
199f0 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
19a00 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
19a10 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
19a20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19a30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
19a50 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
19a60 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
19a70 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
19aa0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
19ab0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
19ac0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
19ad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ae0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
19af0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19b00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19b10 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
19b20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19b30 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
19b40 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
19b50 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
19b60 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
19b70 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
19b80 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
19b90 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
19ba0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19bb0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
19bc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19bd0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
19be0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
19bf0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
19c00 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
19c10 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
19c20 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
19c30 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
19c40 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st,      /* Stor
19c50 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
19c60 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
19c70 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20    u8 reusable   
19c80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
19c90 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
19ca0 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b  s reusable */.){
19cb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
19cc0 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
19cd0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
19ce0 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
19cf0 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70  >pConstExpr;.  p
19d00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
19d10 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
19d20 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
19d30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19d40 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
19d50 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
19d60 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
19d70 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
19d80 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
19d90 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
19da0 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
19db0 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
19dc0 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  st;.     pItem->
19dd0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61  reusable = reusa
19de0 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ble;.  }.  pPars
19df0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
19e00 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  p;.}../*.** Gene
19e10 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
19e20 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
19e30 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
19e40 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
19e50 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
19e60 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
19e70 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
19e80 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
19e90 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
19ea0 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
19eb0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
19ec0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
19ed0 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
19ee0 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
19ef0 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
19f00 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
19f10 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
19f20 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
19f30 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
19f40 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
19f50 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
19f60 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
19f70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
19f80 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
19f90 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
19fa0 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
19fb0 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
19fc0 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
19fd0 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
19fe0 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
19ff0 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
1a000 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
1a010 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
1a020 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a030 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1a040 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1a050 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
1a060 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
1a070 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1a080 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
1a090 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
1a0a0 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
1a0b0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
1a0c0 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
1a0d0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1a0e0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
1a0f0 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73    ){.    ExprLis
1a100 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  t *p = pParse->p
1a110 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69  ConstExpr;.    i
1a120 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20  nt i;.    *pReg 
1a130 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20   = 0;.    if( p 
1a140 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1a150 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1a160 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1a170 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
1a180 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
1a190 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
1a1a0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
1a1b0 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
1a1c0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
1a1d0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
1a1e0 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
1a1f0 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
1a200 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
1a210 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  eg;.        }.  
1a220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a230 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r2 = ++pParse->n
1a240 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1a250 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1a260 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32  Parse, pExpr, r2
1a270 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1a280 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
1a290 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1a2a0 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
1a2b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1a2c0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1a2d0 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
1a2e0 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
1a2f0 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
1a300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1a310 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a320 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
1a330 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
1a340 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1a350 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
1a360 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a370 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
1a380 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
1a390 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
1a3a0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
1a3b0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1a3c0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
1a3d0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
1a3e0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
1a3f0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
1a400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1a410 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
1a420 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a430 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1a440 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
1a450 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1a460 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1a470 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1a480 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72  ( pExpr && pExpr
1a490 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
1a4a0 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
1a4b0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1a4c0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
1a4d0 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
1a4e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
1a4f0 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20  se{.    inReg = 
1a500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1a510 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1a520 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1a530 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1a540 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73  ->pVdbe || pPars
1a550 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1a560 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
1a570 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
1a580 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
1a590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a5a0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1a5b0 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1a5c0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1a5d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1a5e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1a5f0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1a600 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
1a610 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
1a620 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1a630 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1a640 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
1a650 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1a660 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
1a670 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1a680 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
1a690 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
1a6a0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1a6b0 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
1a6c0 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
1a6d0 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
1a6e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1a6f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a700 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
1a710 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1a720 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1a730 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
1a740 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
1a750 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
1a760 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1a770 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1a780 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1a790 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1a7a0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  xpr, target, 0);
1a7b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1a7c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1a7d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1a7e0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
1a7f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a800 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
1a810 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1a820 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
1a830 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
1a840 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
1a850 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
1a860 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
1a870 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
1a880 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
1a890 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
1a8a0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
1a8b0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
1a8c0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
1a8d0 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
1a8e0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
1a8f0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
1a900 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
1a910 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a920 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1a930 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1a940 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
1a950 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
1a960 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
1a970 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
1a980 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
1a990 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
1a9a0 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
1a9b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1a9c0 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
1a9d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1a9e0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1a9f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1aa00 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1aa10 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
1aa20 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1aa30 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1aa40 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
1aa50 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1aa60 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
1aa70 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
1aa80 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1aa90 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
1aaa0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1aab0 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
1aac0 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
1aad0 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
1aae0 6d 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  m);.}..#if defin
1aaf0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1ab00 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
1ab10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1ab20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
1ab30 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  xplanation of an
1ab40 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1ab50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ab60 33 45 78 70 6c 61 69 6e 45 78 70 72 28 56 64 62  3ExplainExpr(Vdb
1ab70 65 20 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a 70  e *pOut, Expr *p
1ab80 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b  Expr){.  int op;
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
1abb0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
1abc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
1abd0 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42  inOp = 0;   /* B
1abe0 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a  inary operator *
1abf0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1ac00 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a  zUniOp = 0;   /*
1ac10 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20   Unary operator 
1ac20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
1ac30 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1ac40 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1ac50 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1ac60 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1ac70 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1ac80 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1ac90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1aca0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1acb0 74 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c  t, "AGG{%d:%d}",
1acc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
1acd0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
1ace0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1acf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ad00 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
1ad10 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
1ad20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
1ad30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1ad40 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
1ad50 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
1ad60 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
1ad70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1ad90 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22  ut, "COLUMN(%d)"
1ada0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1adb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1adc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1add0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ade0 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20  t, "{%d:%d}",.  
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1ae10 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
1ae20 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1ae30 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1ae40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ae50 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
1ae60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
1ae70 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
1ae80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1ae90 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1aea0 66 28 70 4f 75 74 2c 20 22 25 64 22 2c 20 70 45  f(pOut, "%d", pE
1aeb0 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a  xpr->u.iValue);.
1aec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
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 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%s", pExpr->u.z
1af00 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Token);.      }.
1af10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1af20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1af30 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1af40 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
1af50 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
1af60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1af70 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c  rintf(pOut,"%s",
1af80 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1af90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1afa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1afb0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
1afc0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1afd0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1afe0 75 74 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  ut,"%Q", pExpr->
1aff0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1b000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b010 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
1b020 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b030 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b040 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  t,"NULL");.     
1b050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1b060 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b070 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
1b080 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
1b090 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b0a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b0b0 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ut,"%s", pExpr->
1b0c0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1b0d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1b0e0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1b0f0 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
1b100 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b110 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 56 41  nPrintf(pOut,"VA
1b120 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a  RIABLE(%s,%d)",.
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1b150 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70  ->u.zToken, pExp
1b160 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1b170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b180 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1b190 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
1b1a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b1b0 74 66 28 70 4f 75 74 2c 22 52 45 47 49 53 54 45  tf(pOut,"REGISTE
1b1c0 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69  R(%d)", pExpr->i
1b1d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1b1e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1b1f0 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
1b200 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b210 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1b220 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1b230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1b240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b250 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1b260 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1b270 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1b280 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1b290 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1b2a0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  en) */.      con
1b2b0 73 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20  st char *zAff = 
1b2c0 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69  "unk";.      swi
1b2d0 74 63 68 28 20 73 71 6c 69 74 65 33 41 66 66 69  tch( sqlite3Affi
1b2e0 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
1b2f0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 20 29 7b 0a  u.zToken, 0) ){.
1b300 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1b310 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20  ITE_AFF_TEXT:   
1b320 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20   zAff = "TEXT"; 
1b330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b340 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1b350 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66  FF_NONE:    zAff
1b360 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62   = "NONE";     b
1b370 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1b380 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  se SQLITE_AFF_NU
1b390 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e  MERIC: zAff = "N
1b3a0 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b  UMERIC";  break;
1b3b0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1b3c0 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
1b3d0 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45  : zAff = "INTEGE
1b3e0 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  R";  break;.    
1b3f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b400 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66  AFF_REAL:    zAf
1b410 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20  f = "REAL";     
1b420 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1b430 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b440 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1b450 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66  "CAST-%s(", zAff
1b460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b470 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1b480 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1b490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b4a0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b4b0 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1b4c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1b4d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b4e0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1b4f0 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42  e TK_LT:      zB
1b500 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20  inOp = "LT";    
1b510 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b520 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69   TK_LE:      zBi
1b530 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  nOp = "LE";     
1b540 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b550 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
1b560 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62  Op = "GT";     b
1b570 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b580 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GE:      zBinO
1b590 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72  p = "GE";     br
1b5a0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b5b0 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _NE:      zBinOp
1b5c0 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65   = "NE";     bre
1b5d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b5e0 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  EQ:      zBinOp 
1b5f0 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61  = "EQ";     brea
1b600 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1b610 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
1b620 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b   "IS";     break
1b630 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1b640 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NOT:   zBinOp = 
1b650 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  "ISNOT";  break;
1b660 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1b670 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1b680 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  AND";    break;.
1b690 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1b6a0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f       zBinOp = "O
1b6b0 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  R";     break;. 
1b6c0 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1b6d0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44      zBinOp = "AD
1b6e0 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1b6f0 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
1b700 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c     zBinOp = "MUL
1b710 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1b720 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
1b730 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22    zBinOp = "SUB"
1b740 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1b750 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
1b760 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b   zBinOp = "REM";
1b770 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b780 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
1b790 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44  zBinOp = "BITAND
1b7a0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1b7b0 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
1b7c0 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b  BinOp = "BITOR";
1b7d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b7e0 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42  e TK_SLASH:   zB
1b7f0 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20  inOp = "DIV";   
1b800 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b810 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69   TK_LSHIFT:  zBi
1b820 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  nOp = "LSHIFT"; 
1b830 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b840 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
1b850 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62  Op = "RSHIFT"; b
1b860 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b870 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f  K_CONCAT:  zBinO
1b880 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72  p = "CONCAT"; br
1b890 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
1b8a0 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f  K_UMINUS:  zUniO
1b8b0 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72  p = "UMINUS"; br
1b8c0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b8d0 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70  _UPLUS:   zUniOp
1b8e0 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65   = "UPLUS";  bre
1b8f0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b900 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20  BITNOT:  zUniOp 
1b910 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61  = "BITNOT"; brea
1b920 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
1b930 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d  OT:     zUniOp =
1b940 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b   "NOT";    break
1b950 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1b960 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  NULL:  zUniOp = 
1b970 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  "ISNULL"; break;
1b980 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1b990 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22  NULL: zUniOp = "
1b9a0 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
1b9b0 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ..    case TK_CO
1b9c0 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73  LLATE: {.      s
1b9d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1b9e0 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1b9f0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1ba00 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ba10 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54 45  f(pOut,".COLLATE
1ba20 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e 7a  (%s)",pExpr->u.z
1ba30 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1ba40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ba50 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
1ba60 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
1ba70 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
1ba80 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
1ba90 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
1baa0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
1bab0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
1bac0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1bad0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1bae0 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
1baf0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
1bb00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bb10 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
1bb20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1bb30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bb40 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
1bb50 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ION ){.        s
1bb60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bb70 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47 5f 46  ntf(pOut, "AGG_F
1bb80 55 4e 43 54 49 4f 4e 25 64 3a 25 73 28 22 2c 0a  UNCTION%d:%s(",.
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1bbb0 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e  pr->op2, pExpr->
1bbc0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1bbd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bbe0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bbf0 69 6e 74 66 28 70 4f 75 74 2c 20 22 46 55 4e 43  intf(pOut, "FUNC
1bc00 54 49 4f 4e 3a 25 73 28 22 2c 20 70 45 78 70 72  TION:%s(", pExpr
1bc10 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1bc20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1bc30 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
1bc40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1bc50 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 46 61  prList(pOut, pFa
1bc60 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1bc70 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bc80 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1bc90 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1bca0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1bcb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bcc0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1bcd0 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20  EXISTS: {.      
1bce0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bcf0 69 6e 74 66 28 70 4f 75 74 2c 20 22 45 58 49 53  intf(pOut, "EXIS
1bd00 54 53 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  TS(");.      sql
1bd10 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63  ite3ExplainSelec
1bd20 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1bd30 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
1bd40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bd50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b  rintf(pOut,")");
1bd60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bd70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bd80 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
1bd90 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bda0 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 22 29 3b  intf(pOut, "(");
1bdb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bdc0 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74  plainSelect(pOut
1bdd0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
1bde0 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
1bdf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1be00 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1be10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1be20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1be30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1be40 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1be50 2c 20 22 49 4e 28 22 29 3b 0a 20 20 20 20 20 20  , "IN(");.      
1be60 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1be70 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1be80 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1be90 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1bea0 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20  tf(pOut, ",");. 
1beb0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1bec0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1bed0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1bee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bef0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f  ExplainSelect(pO
1bf00 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  ut, pExpr->x.pSe
1bf10 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lect);.      }el
1bf20 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1bf30 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1bf40 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  st(pOut, pExpr->
1bf50 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1bf60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1bf70 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bf80 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1bf90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1bfa0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1bfb0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
1bfc0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
1bfd0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
1bfe0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
1bff0 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
1c000 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
1c010 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
1c020 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
1c030 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
1c040 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
1c050 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
1c060 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
1c070 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
1c080 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
1c090 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
1c0a0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
1c0b0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c0c0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1c0d0 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
1c0e0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1c0f0 20 20 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45     Expr *pY = pE
1c100 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1c110 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
1c120 45 78 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72  Expr *pZ = pExpr
1c130 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
1c140 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
1c150 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c160 66 28 70 4f 75 74 2c 20 22 42 45 54 57 45 45 4e  f(pOut, "BETWEEN
1c170 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1c180 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1c190 75 74 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 73  ut, pX);.      s
1c1a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c1b0 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a  ntf(pOut, ",");.
1c1c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c1d0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1c1e0 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Y);.      sqlite
1c1f0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c200 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1c210 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c220 78 70 72 28 70 4f 75 74 2c 20 70 5a 29 3b 0a 20  xpr(pOut, pZ);. 
1c230 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c240 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c250 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
1c260 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c270 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
1c280 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c290 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
1c2a0 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
1c2b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
1c2c0 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
1c2d0 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
1c2e0 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
1c2f0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
1c300 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
1c310 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
1c320 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
1c330 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
1c340 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
1c350 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
1c360 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
1c370 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
1c380 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1c390 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
1c3a0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
1c3b0 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
1c3c0 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
1c3d0 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
1c3e0 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
1c3f0 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
1c400 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f   field..      */
1c410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c420 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c430 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20  , "%s(%d)", .   
1c440 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
1c450 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22  able ? "NEW" : "
1c460 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f  OLD", pExpr->iCo
1c470 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  lumn);.      bre
1c480 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c490 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20  se TK_CASE: {.  
1c4a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c4b0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c4c0 43 41 53 45 28 22 29 3b 0a 20 20 20 20 20 20 73  CASE(");.      s
1c4d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1c4e0 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1c4f0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1c500 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c510 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1c520 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c530 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c  inExprList(pOut,
1c540 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1c550 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c560 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c570 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1c580 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
1c590 53 45 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  SE: {.      cons
1c5a0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
1c5b0 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69  "unk";.      swi
1c5c0 74 63 68 28 20 70 45 78 70 72 2d 3e 61 66 66 69  tch( pExpr->affi
1c5d0 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
1c5e0 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
1c5f0 3a 20 20 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c  :   zType = "rol
1c600 6c 62 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a  lback";  break;.
1c610 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1c620 41 62 6f 72 74 3a 20 20 20 20 20 20 7a 54 79 70  Abort:      zTyp
1c630 65 20 3d 20 22 61 62 6f 72 74 22 3b 20 20 20 20  e = "abort";    
1c640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c650 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20  case OE_Fail:   
1c660 20 20 20 20 7a 54 79 70 65 20 3d 20 22 66 61 69      zType = "fai
1c670 6c 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l";      break;.
1c680 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f          case OE_
1c690 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79 70  Ignore:     zTyp
1c6a0 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20 20  e = "ignore";   
1c6b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c6d0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c6e0 20 22 52 41 49 53 45 2d 25 73 28 25 73 29 22 2c   "RAISE-%s(%s)",
1c6f0 20 7a 54 79 70 65 2c 20 70 45 78 70 72 2d 3e 75   zType, pExpr->u
1c700 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1c710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1c720 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42  dif.  }.  if( zB
1c730 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  inOp ){.    sqli
1c740 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c750 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 42 69  (pOut,"%s(", zBi
1c760 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nOp);.    sqlite
1c770 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1c780 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1c790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c7a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c7b0 22 2c 22 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ",");.    assert
1c7c0 28 20 45 78 70 72 55 73 65 73 52 69 67 68 74 28  ( ExprUsesRight(
1c7d0 70 45 78 70 72 29 20 29 3b 0a 20 20 20 20 73 71  pExpr) );.    sq
1c7e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1c7f0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1c800 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  pRight);.    sql
1c810 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c820 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d  f(pOut,")");.  }
1c830 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20  else if( zUniOp 
1c840 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1c850 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c860 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b  ,"%s(", zUniOp);
1c870 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c880 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1c890 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c8a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c8b0 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b  rintf(pOut,")");
1c8c0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1c8d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c8e0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1c8f0 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  AIN) */..#if def
1c900 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1c910 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
1c920 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c930 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
1c940 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
1c950 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
1c960 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1c970 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1c980 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45  st(Vdbe *pOut, E
1c990 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1c9a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1c9b0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
1c9c0 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20  t->nExpr==0 ){. 
1c9d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c9e0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1c9f0 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20  empty-list)");. 
1ca00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
1ca10 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  se if( pList->nE
1ca20 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  xpr==1 ){.    sq
1ca30 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1ca40 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  (pOut, pList->a[
1ca50 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  0].pExpr);.  }el
1ca60 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1ca70 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29  xplainPush(pOut)
1ca80 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1ca90 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1caa0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1cab0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1cac0 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20  pOut, "item[%d] 
1cad0 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  = ", i);.      s
1cae0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
1caf0 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73  h(pOut);.      s
1cb00 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1cb10 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61  r(pOut, pList->a
1cb20 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1cb30 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1cb40 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  Pop(pOut);.     
1cb50 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1cb60 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
1cb70 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1cb80 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 41  Printf(pOut, " A
1cb90 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  S %s", pList->a[
1cba0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
1cbb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69   }.      if( pLi
1cbc0 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73  st->a[i].bSpanIs
1cbd0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1cbe0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1cbf0 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25 73 29  ntf(pOut, " (%s)
1cc00 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
1cc10 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
1cc20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74       if( i<pList
1cc30 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1cc40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1cc50 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20  ainNL(pOut);.   
1cc60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1cc70 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
1cc80 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  (pOut);.  }.}.#e
1cc90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
1cca0 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
1ccb0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1ccc0 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
1ccd0 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
1cce0 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
1ccf0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
1cd00 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
1cd10 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1cd20 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
1cd30 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
1cd40 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1cd50 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
1cd60 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ted..**.** The S
1cd70 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
1cd80 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
1cd90 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
1cda0 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
1cdb0 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
1cdc0 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
1cdd0 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
1cde0 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
1cdf0 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
1ce00 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
1ce10 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
1ce20 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
1ce30 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
1ce40 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
1ce50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1ce60 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
1ce70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ce80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1ce90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1cea0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
1ceb0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1cec0 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
1ced0 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
1cee0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
1cef0 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
1cf00 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  lts */.  u8 flag
1cf10 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
1cf20 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
1cf30 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
1cf40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1cf50 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
1cf60 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20   n;.  u8 copyOp 
1cf70 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1cf80 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50  E_ECEL_DUP) ? OP
1cf90 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  _Copy : OP_SCopy
1cfa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1cfb0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
1cfc0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
1cfd0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1cfe0 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
1cff0 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
1d000 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
1d010 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
1d020 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
1d030 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1d040 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
1d050 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
1d060 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1d070 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
1d080 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d090 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1d0a0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
1d0b0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1d0c0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
1d0d0 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
1d0e0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1d0f0 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1d100 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d110 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1d120 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c  pExpr, target+i,
1d130 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1d140 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20        int inReg 
1d150 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d160 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1d170 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
1d180 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
1d190 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
1d1a0 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
1d1b0 4f 70 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Op;.        Vdbe
1d1c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d1d0 64 62 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dbe;.        if(
1d1e0 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
1d1f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
1d200 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
1d210 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
1d220 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
1d230 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
1d240 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
1d250 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
1d260 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
1d270 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
1d280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
1d290 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
1d2a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d2b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d2c0 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
1d2d0 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
1d2e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d2f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1d300 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
1d310 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d320 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
1d330 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
1d340 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
1d350 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
1d360 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
1d370 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
1d380 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
1d390 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
1d3a0 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
1d3b0 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
1d3c0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
1d3d0 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66   elementation of
1d3e0 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   x..*/.static vo
1d3f0 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
1d400 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
1d410 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1d420 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1d430 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1d440 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1d450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
1d460 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
1d470 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
1d480 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1d490 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20  ere if the jump 
1d4a0 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e  is taken */.  in
1d4b0 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20  t jumpIfTrue,   
1d4c0 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1d4d0 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1d4e0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1d4f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1d500 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
1d510 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
1d520 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45  s NULL */.){.  E
1d530 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
1d540 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
1d550 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
1d560 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
1d570 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
1d580 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
1d590 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
1d5a0 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
1d5b0 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
1d5c0 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
1d5d0 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
1d5e0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1d5f0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1d600 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
1d610 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
1d620 0a 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48  .  assert( ExprH
1d630 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d640 2c 20 45 50 5f 78 49 73 4c 69 73 74 29 20 29 3b  , EP_xIsList) );
1d650 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1d660 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1d670 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1d680 0a 20 20 65 78 70 72 41 6e 64 2e 66 6c 61 67 73  .  exprAnd.flags
1d690 20 3d 20 30 3b 0a 20 20 65 78 70 72 41 6e 64 2e   = 0;.  exprAnd.
1d6a0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1d6b0 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 78 2e 70  t;.  exprAnd.x.p
1d6c0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
1d6d0 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
1d6e0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
1d6f0 70 4c 65 66 74 2e 66 6c 61 67 73 20 3d 20 30 3b  pLeft.flags = 0;
1d700 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
1d710 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1d720 6d 70 4c 65 66 74 2e 78 2e 70 52 69 67 68 74 20  mpLeft.x.pRight 
1d730 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d740 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1d750 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
1d760 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
1d770 74 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 63  t.flags = 0;.  c
1d780 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
1d790 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52   &exprX;.  compR
1d7a0 69 67 68 74 2e 78 2e 70 52 69 67 68 74 20 3d 20  ight.x.pRight = 
1d7b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1d7c0 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
1d7d0 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
1d7e0 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  prX, sqlite3Expr
1d7f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1d800 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
1d810 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70  e1));.  if( jump
1d820 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71  IfTrue ){.    sq
1d830 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1d840 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1d850 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1d860 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
1d870 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1d880 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
1d890 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1d8a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
1d8b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1d8c0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1d8d0 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
1d8e0 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
1d8f0 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
1d900 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d910 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1d920 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1d930 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d940 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d950 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1d960 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d970 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1d980 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d990 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1d9a0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1d9b0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1d9c0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d9d0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d9e0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1d9f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1da00 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1da10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1da20 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1da30 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1da40 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1da50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1da60 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1da70 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1da80 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1da90 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1daa0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1dab0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1dac0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1dad0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1dae0 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=0 );.}../*.**
1daf0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1db00 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1db10 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1db20 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1db30 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1db40 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1db50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1db60 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1db70 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1db80 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1db90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1dba0 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
1dbb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1dbc0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1dbd0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1dbe0 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
1dbf0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1dc00 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
1dc10 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
1dc20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
1dc30 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
1dc40 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1dc50 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
1dc60 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
1dc70 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
1dc80 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
1dc90 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
1dca0 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
1dcb0 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
1dcc0 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
1dcd0 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
1dce0 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
1dcf0 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
1dd00 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
1dd10 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
1dd20 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
1dd30 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
1dd40 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
1dd50 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
1dd60 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1dd70 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
1dd80 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
1dd90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1dda0 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
1ddb0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1ddc0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1ddd0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1dde0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1ddf0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1de00 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1de10 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1de20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1de30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1de40 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1de50 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1de60 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1de70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1de80 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1de90 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
1dea0 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
1deb0 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1dec0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
1ded0 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
1dee0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
1def0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1df00 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
1df10 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
1df20 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1df30 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1df40 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1df50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1df60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1df70 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1df80 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1df90 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1dfa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1dfb0 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
1dfc0 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1dfd0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1dfe0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1dff0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 61  pParse);.      a
1e000 73 73 65 72 74 28 20 45 78 70 72 55 73 65 73 52  ssert( ExprUsesR
1e010 69 67 68 74 28 70 45 78 70 72 29 20 29 3b 0a 20  ight(pExpr) );. 
1e020 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e030 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1e040 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20  Expr->x.pRight, 
1e050 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e060 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e070 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e080 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1e090 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1e0a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1e0b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e0c0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1e0d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e0e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e0f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e100 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1e110 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e120 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e130 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e140 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1e150 61 72 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73  arse);.      ass
1e160 65 72 74 28 20 45 78 70 72 55 73 65 73 52 69 67  ert( ExprUsesRig
1e170 68 74 28 70 45 78 70 72 29 20 29 3b 0a 20 20 20  ht(pExpr) );.   
1e180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e190 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1e1a0 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 64 65  pr->x.pRight, de
1e1b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1e1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e1d0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1e1e0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1e1f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e200 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1e210 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1e220 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1e230 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1e240 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1e250 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1e260 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e280 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1e290 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1e2a0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1e2b0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1e2c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1e2d0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1e2e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e2f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e300 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e320 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e330 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e340 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
1e350 28 20 45 78 70 72 55 73 65 73 52 69 67 68 74 28  ( ExprUsesRight(
1e360 70 45 78 70 72 29 20 29 3b 0a 20 20 20 20 20 20  pExpr) );.      
1e370 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1e380 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e390 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74   pExpr->x.pRight
1e3a0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1e3b0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1e3c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e3d0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  Left, pExpr->x.p
1e3e0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1e400 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1e410 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
1e420 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1e430 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1e440 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1e450 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e460 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
1e470 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1e480 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1e490 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1e4a0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1e4b0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
1e4c0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1e4d0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e4e0 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1e4f0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1e500 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1e510 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1e520 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1e530 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1e540 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1e550 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e560 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1e570 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1e580 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e590 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1e5a0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1e5b0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1e5c0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1e5d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e5e0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1e5f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e600 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e610 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e620 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1e630 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e640 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1e650 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1e660 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e670 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
1e680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e690 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1e6a0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e6b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e6c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e6d0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
1e6f0 70 72 55 73 65 73 52 69 67 68 74 28 70 45 78 70  prUsesRight(pExp
1e700 72 29 20 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  r) );.      r2 =
1e710 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e720 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e730 70 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 26 72  pr->x.pRight, &r
1e740 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e750 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1e760 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1e770 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1e780 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1e790 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1e7a0 3e 78 2e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  >x.pRight, op,. 
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1e7d0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1e7e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e7f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
1e800 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1e810 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1e820 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
1e830 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1e840 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1e850 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1e860 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1e870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e880 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1e890 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1e8a0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1e8b0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1e8c0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1e8d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1e8e0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1e8f0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1e900 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1e910 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1e920 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1e930 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e940 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e950 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1e960 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e980 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
1e990 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
1e9a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1e9b0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1e9c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1e9d0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1e9e0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
1e9f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1ea00 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1ea10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ea20 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1ea30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1ea40 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1ea50 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
1ea60 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
1ea70 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75  xpr, dest, 1, ju
1ea80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ea90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1eaa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eab0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1eac0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
1ead0 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
1eae0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1eaf0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1eb00 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
1eb10 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
1eb20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
1eb30 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
1eb40 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1eb50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1eb60 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1eb70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1eb80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1eb90 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
1eba0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1ebb0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ebc0 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1ebd0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1ebe0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1ebf0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1ec00 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
1ec10 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
1ec20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ec30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ec40 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
1ec50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ec60 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
1ec70 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1ec80 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
1ec90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eca0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ecb0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ecc0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
1ecd0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
1ece0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ecf0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
1ed00 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
1ed10 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
1ed20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1ed30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ed40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1ed50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ed60 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1ed70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ed80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1ed90 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1eda0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1edb0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1edc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1edd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1ede0 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
1edf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ee00 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1ee10 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1ee20 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1ee30 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1ee40 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1ee50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
1ee60 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
1ee70 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1ee80 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1ee90 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1eea0 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
1eeb0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1eec0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1eed0 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1eee0 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
1eef0 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
1ef00 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
1ef10 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
1ef20 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
1ef30 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
1ef40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ef50 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
1ef60 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1ef70 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1ef80 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1ef90 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1efa0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1efb0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1efc0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1efd0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1efe0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1eff0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1f000 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1f010 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1f020 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1f030 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1f040 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
1f050 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
1f060 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
1f070 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
1f080 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
1f090 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
1f0a0 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
1f0b0 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
1f0c0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
1f0d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
1f0e0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
1f0f0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
1f100 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
1f110 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
1f120 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
1f130 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
1f140 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
1f150 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
1f160 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
1f170 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1f190 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
1f1a0 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
1f1b0 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
1f1c0 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
1f1d0 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
1f1e0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
1f1f0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
1f200 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1f220 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
1f230 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
1f240 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
1f250 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
1f260 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
1f270 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
1f280 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
1f290 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
1f2a0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
1f2b0 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
1f2c0 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
1f2d0 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
1f2e0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
1f2f0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
1f300 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
1f310 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
1f320 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1f330 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
1f340 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
1f350 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
1f360 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
1f370 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
1f380 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
1f390 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
1f3a0 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1f3b0 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
1f3c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f3d0 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
1f3e0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
1f3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f400 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
1f410 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
1f420 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
1f430 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
1f440 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
1f450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f460 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
1f470 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
1f480 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f490 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
1f4a0 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
1f4b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f4c0 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
1f4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f4e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
1f4f0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
1f500 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f510 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
1f520 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
1f530 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
1f540 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1f550 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f560 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f570 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f580 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f590 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f5a0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1f5b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f5c0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f5d0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1f5e0 20 61 73 73 65 72 74 28 20 45 78 70 72 55 73 65   assert( ExprUse
1f5f0 73 52 69 67 68 74 28 70 45 78 70 72 29 20 29 3b  sRight(pExpr) );
1f600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f610 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f620 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68  , pExpr->x.pRigh
1f630 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f640 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f650 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f660 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
1f670 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f680 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1f690 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
1f6a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f6b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
1f6c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f6d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1f6e0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1f6f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f700 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
1f710 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
1f720 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
1f730 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1f740 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1f750 20 20 61 73 73 65 72 74 28 20 45 78 70 72 55 73    assert( ExprUs
1f760 65 73 52 69 67 68 74 28 70 45 78 70 72 29 20 29  esRight(pExpr) )
1f770 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f780 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f790 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67  e, pExpr->x.pRig
1f7a0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1f7b0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f7c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1f7d0 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1f7e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f7f0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1f800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f810 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1f820 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1f830 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f840 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1f850 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1f860 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f870 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1f880 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1f890 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f8a0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1f8b0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1f8c0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1f8d0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1f8e0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1f8f0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1f900 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f910 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f920 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f930 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f940 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f950 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f960 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
1f970 72 55 73 65 73 52 69 67 68 74 28 70 45 78 70 72  rUsesRight(pExpr
1f980 29 20 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  ) );.      r2 = 
1f990 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f9a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f9b0 72 2d 3e 78 2e 70 52 69 67 68 74 2c 20 26 72 65  r->x.pRight, &re
1f9c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
1f9d0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1f9e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f9f0 20 70 45 78 70 72 2d 3e 78 2e 70 52 69 67 68 74   pExpr->x.pRight
1fa00 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1fa10 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1fa20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1fa30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fa40 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1fa50 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1fa60 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1fa70 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1fa80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fa90 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1faa0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1fab0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1fac0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1fad0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1fae0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1faf0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1fb00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fb10 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1fb20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1fb30 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1fb40 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1fb50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1fb60 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1fb70 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
1fb80 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
1fb90 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
1fba0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1fbb0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61  =OP_Eq);.      a
1fbc0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1fbd0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1fbe0 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1fbf0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fc00 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ne);.      tes
1fc10 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fc20 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1fc30 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fc40 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fc50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fc60 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1fc70 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
1fc80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1fc90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
1fca0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fcb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1fcc0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1fcd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fce0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fcf0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fd00 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 61  gFree1);.      a
1fd10 73 73 65 72 74 28 20 45 78 70 72 55 73 65 73 52  ssert( ExprUsesR
1fd20 69 67 68 74 28 70 45 78 70 72 29 20 29 3b 0a 20  ight(pExpr) );. 
1fd30 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1fd40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fd50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70  arse, pExpr->x.p
1fd60 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1fd70 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
1fd80 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
1fd90 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
1fda0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1fdb0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1fdc0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1fdd0 3e 78 2e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  >x.pRight, op,. 
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1fe00 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1fe10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1fe20 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
1fe30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1fe40 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1fe50 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
1fe60 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fe70 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1fe80 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fe90 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1feb0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1fec0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1fed0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1fee0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1fef0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1ff00 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1ff10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1ff20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1ff30 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1ff40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1ff50 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
1ff60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ff70 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1ff80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ff90 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1ffa0 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
1ffb0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1ffc0 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
1ffd0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ffe0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1fff0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20000 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
20010 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20020 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20030 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
20040 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
20050 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
20060 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20090 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
200a0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
200b0 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
200c0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
200d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
200e0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
200f0 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
20100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20110 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
20120 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
20130 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20140 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20150 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
20160 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
20170 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
20180 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20190 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
201a0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
201b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
201c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
201d0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
201e0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
201f0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
20200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20210 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
20220 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
20230 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
20240 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
20250 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
20260 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
20270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20280 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20290 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
202a0 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
202b0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
202c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
202d0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
202e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
202f0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
20300 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20310 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20320 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
20330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20340 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20360 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
20370 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20380 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20390 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
203a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
203b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
203c0 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
203d0 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
203e0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
203f0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
20400 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
20410 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
20420 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
20430 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
20440 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
20450 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
20460 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
20470 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
20480 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
20490 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
204a0 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
204b0 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
204c0 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
204d0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
204e0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
204f0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
20500 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
20510 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
20520 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
20530 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
20540 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
20550 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
20560 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
20570 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
20580 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
20590 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
205a0 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
205b0 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
205c0 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
205d0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
205e0 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
205f0 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
20600 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
20610 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
20620 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
20630 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
20640 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
20650 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
20660 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
20670 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
20680 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
20690 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
206a0 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
206b0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
206c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
206d0 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
206e0 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
206f0 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
20700 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
20710 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
20720 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
20730 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
20740 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
20750 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
20760 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
20770 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
20780 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
20790 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
207a0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
207b0 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
207c0 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
207d0 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
207e0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
207f0 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
20800 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
20810 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
20820 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
20830 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
20840 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
20850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
20860 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
20870 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
20880 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63  t iTab){.  u32 c
20890 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20  ombinedFlags;.  
208a0 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
208b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
208c0 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
208d0 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46  .  }.  combinedF
208e0 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73  lags = pA->flags
208f0 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20   | pB->flags;.  
20900 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
20910 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
20920 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e  ){.    if( (pA->
20930 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26  flags&pB->flags&
20940 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
20950 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d  && pA->u.iValue=
20960 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
20970 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20980 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
20990 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
209a0 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b  A->op!=pB->op ){
209b0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
209c0 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
209d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
209e0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c  e(pA->pLeft, pB,
209f0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
20a00 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
20a10 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
20a20 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
20a30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20a40 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74  re(pA, pB->pLeft
20a50 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
20a60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20a70 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
20a80 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
20a90 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
20aa0 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54  ALWAYS(pA->op!=T
20ab0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
20ac0 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
20ad0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
20ae0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
20af0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
20b00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
20b10 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
20b20 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
20b30 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
20b40 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
20b50 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
20b60 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
20b70 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
20b80 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
20b90 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
20ba0 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
20bb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20bc0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
20bd0 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
20be0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
20bf0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
20c00 61 67 73 26 45 50 5f 78 4d 61 73 6b 29 21 3d 28  ags&EP_xMask)!=(
20c10 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 78 4d 61  pB->flags&EP_xMa
20c20 73 6b 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  sk) ) return 2;.
20c30 20 20 20 20 69 66 28 20 45 78 70 72 55 73 65 73      if( ExprUses
20c40 52 69 67 68 74 28 70 41 29 20 29 7b 0a 20 20 20  Right(pA) ){.   
20c50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
20c60 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  prCompare(pA->x.
20c70 70 52 69 67 68 74 2c 20 70 42 2d 3e 78 2e 70 52  pRight, pB->x.pR
20c80 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
20c90 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
20ca0 65 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f  e if( ExprHasPro
20cb0 70 65 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73  perty(pA, EP_xIs
20cc0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
20cd0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
20ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
20cf0 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
20d00 72 74 79 28 70 41 2c 20 45 50 5f 78 49 73 4c 69  rty(pA, EP_xIsLi
20d10 73 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  st) );.      if(
20d20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
20d30 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c  Compare(pA->x.pL
20d40 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74  ist, pB->x.pList
20d50 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
20d60 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
20d70 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
20d80 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
20d90 75 63 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20  uced)==0) ){.   
20da0 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
20db0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
20dc0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20dd0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
20de0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
20df0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
20e00 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
20e10 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
20e20 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
20e30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20e40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
20e50 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
20e60 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
20e70 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
20e80 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
20e90 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
20ea0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
20eb0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
20ec0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
20ed0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
20ee0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
20ef0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
20f00 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
20f10 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
20f20 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
20f30 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
20f40 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
20f50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
20f60 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
20f70 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
20f80 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
20f90 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
20fa0 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
20fb0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
20fc0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
20fd0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
20fe0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
20ff0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
21000 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
21010 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
21020 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
21030 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
21040 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
21050 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
21060 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
21070 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
21080 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
21090 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
210a0 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
210b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
210c0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
210d0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
210e0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
210f0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
21100 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
21110 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21120 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
21130 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
21140 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
21150 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
21160 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
21170 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
21180 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
21190 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
211a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
211b0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
211c0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
211d0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
211e0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
211f0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
21200 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
21210 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21220 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  e(pExprA, pExprB
21230 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
21240 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
21250 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
21260 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 63  urn true if we c
21270 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45 32  an prove the pE2
21280 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
21290 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a  true if pE1 is.*
212a0 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20  * true.  Return 
212b0 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e  false if we cann
212c0 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  ot complete the 
212d0 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20  proof or if pE2 
212e0 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73  might.** be fals
212f0 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  e.  Examples:.**
21300 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d  .**     pE1: x==
21310 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d  5       pE2: x==
21320 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
21330 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
21340 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20    pE1: x>0      
21350 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
21360 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
21370 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
21380 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45 32  : x=21       pE2
21390 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20  : x=21 OR y=43  
213a0 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
213b0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31  **     pE1: x!=1
213c0 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  23     pE2: x IS
213d0 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
213e0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
213f0 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20   pE1: x!=?1     
21400 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
21410 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
21420 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
21430 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20  x IS NULL  pE2: 
21440 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
21450 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
21460 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
21470 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53 20  ?2    pE2: x IS 
21480 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73  NOT NULL    Reus
21490 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20  lt: false.**.** 
214a0 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54  When comparing T
214b0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62  K_COLUMN nodes b
214c0 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70  etween pE1 and p
214d0 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a  E2, if pE2 has.*
214e0 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20  * Expr.iTable<0 
214f0 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61  then assume a ta
21500 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e  ble number given
21510 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   by iTab..**.** 
21520 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
21530 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
21540 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
21550 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
21560 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
21570 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
21580 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
21590 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
215a0 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
215b0 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
215c0 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
215d0 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
215e0 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
215f0 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
21600 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
21610 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  r(Expr *pE1, Exp
21620 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
21630 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
21640 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c  ExprCompare(pE1,
21650 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29   pE2, iTab)==0 )
21660 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21670 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
21680 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28  p==TK_OR.   && (
21690 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
216a0 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d  esExpr(pE1, pE2-
216b0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
216c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
216d0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
216e0 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 78  Expr(pE1, pE2->x
216f0 2e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  .pRight, iTab) )
21700 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
21710 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
21720 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
21730 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  L.   && sqlite3E
21740 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2d 3e  xprCompare(pE1->
21750 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65 66  pLeft, pE2->pLef
21760 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20 20 26  t, iTab)==0.   &
21770 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  & (pE1->op!=TK_I
21780 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70  SNULL && pE1->op
21790 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20 20  !=TK_IS).  ){.  
217a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
217b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
217c0 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
217d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
217e0 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
217f0 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
21800 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
21810 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
21820 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
21830 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
21840 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
21850 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
21860 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
21870 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
21880 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
21890 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
218a0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
218b0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
218c0 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
218d0 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
218e0 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
218f0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
21900 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
21910 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
21920 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
21930 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
21940 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
21950 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
21960 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
21970 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
21980 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
21990 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
219a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
219b0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
219c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
219d0 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
219e0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
219f0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
21a00 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
21a10 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
21a20 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
21a30 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
21a40 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
21a50 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
21a60 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
21a70 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21a80 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
21a90 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
21aa0 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
21ab0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
21ac0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
21ad0 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
21ae0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
21af0 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
21b00 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
21b10 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
21b20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
21b30 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
21b40 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
21b50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
21b60 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
21b70 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
21b80 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
21b90 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
21ba0 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
21bb0 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
21bc0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
21bd0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
21be0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
21bf0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
21c00 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
21c10 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
21c20 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
21c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21c40 69 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  i<pSrc->nSrc ){.
21c50 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
21c60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21c70 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
21c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21c90 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
21ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
21cb0 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
21cc0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
21cd0 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
21ce0 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
21cf0 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
21d00 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
21d10 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
21d20 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
21d30 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
21d40 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
21d50 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
21d60 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
21d70 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
21d80 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
21d90 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
21da0 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
21db0 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
21dc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21dd0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
21de0 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
21df0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
21e00 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
21e10 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
21e20 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
21e30 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
21e40 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
21e50 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
21e60 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
21e70 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
21e80 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
21e90 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
21ea0 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
21eb0 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
21ec0 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
21ed0 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
21ee0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
21ef0 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
21f00 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
21f10 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
21f20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
21f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
21f40 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
21f50 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
21f60 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
21f70 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
21f80 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
21f90 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
21fa0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
21fb0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
21fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
21fd0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
21fe0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
21ff0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
22000 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
22010 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
22020 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
22030 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
22040 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
22050 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
22060 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
22070 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
22080 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
22090 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
220a0 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
220b0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
220c0 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
220d0 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
220e0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
220f0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
22100 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
22110 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
22120 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
22130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
22140 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
22150 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
22160 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
22170 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
22180 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
22190 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
221a0 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
221b0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
221c0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
221d0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
221e0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
221f0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
22200 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
22210 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
22220 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
22230 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
22240 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
22250 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
22260 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
22270 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
22280 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
22290 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
222a0 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
222b0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
222c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
222d0 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
222e0 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
222f0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
22300 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
22310 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
22320 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
22330 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
22340 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
22350 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
22360 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
22370 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
22380 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
22390 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
223a0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
223b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
223c0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
223d0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
223e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
223f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
22400 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22410 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
22420 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
22430 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
22440 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
22450 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
22460 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
22470 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
22480 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
22490 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
224a0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
224b0 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
224c0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
224d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
224e0 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
224f0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
22500 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
22510 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
22520 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
22530 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
22540 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
22550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22560 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
22570 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
22580 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
22590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
225a0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
225b0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
225c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
225d0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
225e0 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
225f0 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
22600 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
22610 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
22620 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
22630 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
22640 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
22650 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
22660 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
22670 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
22680 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
22690 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
226a0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
226b0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
226c0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
226d0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
226e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
226f0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
22700 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
22710 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
22720 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
22730 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
22740 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
22750 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
22760 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
22770 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
22780 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
22790 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
227a0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
227b0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
227c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
227d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
227e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
227f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22800 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
22810 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
22820 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
22830 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
22840 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
22850 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
22860 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
22870 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
22880 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
228a0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
228b0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
228c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
228d0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
228e0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
228f0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
22900 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
22910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22920 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
22930 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22940 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22950 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
22960 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
22970 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
22980 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
22990 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
229a0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
229d0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
229e0 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
229f0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
22a10 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
22a20 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
22a30 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
22a40 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
22a50 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
22a60 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
22a70 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
22a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22a90 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
22aa0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22ac0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
22ad0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
22ae0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
22af0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
22b00 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
22b10 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
22b20 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22b40 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22b50 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
22b60 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22bb0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
22bc0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
22bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22be0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
22bf0 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
22c00 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
22c10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
22c20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22c30 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
22c40 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
22c50 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
22c60 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
22c70 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
22c80 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
22c90 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
22ca0 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
22cb0 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
22cc0 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
22cd0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
22ce0 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
22cf0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
22d00 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
22d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22d20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
22d30 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
22d40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22d50 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
22d60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
22d70 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
22d80 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
22d90 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
22da0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
22db0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
22dc0 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
22dd0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
22de0 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
22df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22e00 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
22e10 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
22e20 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
22e30 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
22e40 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
22e50 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
22e60 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
22e70 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
22e80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
22e90 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
22ea0 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
22eb0 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
22ec0 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
22ed0 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
22ee0 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
22ef0 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
22f00 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
22f10 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
22f20 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
22f30 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
22f40 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
22f50 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
22f60 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
22f70 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
22f80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22f90 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
22fa0 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
22fb0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22fc0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
22fd0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
22fe0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
22ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
23000 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
23010 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
23020 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
23030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23040 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23050 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23060 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
23070 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
23080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
23090 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
230a0 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
230b0 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
230c0 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
230d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
230e0 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
230f0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
23100 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
23110 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
23120 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
23130 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
23140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
23150 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
23160 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23170 78 49 73 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xIsList) );.    
23180 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
23190 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
231a0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
231b0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
231c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
231d0 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
231e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
231f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23200 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23210 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23220 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
23230 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
23240 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
23250 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
23260 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
23270 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
23280 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69  ->u.zToken, sqli
23290 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
232a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20  r->u.zToken),.  
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
232d0 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
232e0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
232f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23300 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
23310 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
23320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23330 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
23340 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
23350 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
23360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23370 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
23380 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
23390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
233a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
233b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
233c0 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
233d0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
233e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
233f0 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
23400 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
23410 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23420 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
23430 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
23440 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
23450 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
23460 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
23470 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
23480 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
23490 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
234a0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
234b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
234c0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
234d0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
234e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
234f0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
23500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
23510 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23520 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
23530 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
23540 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
23550 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
23560 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
23570 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23580 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
23590 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
235a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
235b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
235c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
235d0 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
235e0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
235f0 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
23600 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
23610 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
23620 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
23630 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
23640 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
23650 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
23660 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
23670 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
23680 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
23690 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
236a0 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
236b0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
236c0 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
236d0 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
236e0 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
236f0 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
23700 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
23710 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
23720 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
23730 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
23740 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
23750 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
23760 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
23770 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
23780 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
23790 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
237a0 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
237b0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
237c0 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
237d0 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
237e0 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
237f0 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
23800 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
23810 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
23820 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
23830 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
23840 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
23850 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
23860 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
23870 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
23880 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
23890 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
238a0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
238b0 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
238c0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
238d0 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
238e0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
238f0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
23900 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
23910 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
23920 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
23930 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23940 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
23950 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
23960 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
23970 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
23980 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
23990 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
239a0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
239b0 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
239c0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
239d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
239e0 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
239f0 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
23a00 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
23a10 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
23a20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
23a30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
23a40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
23a50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
23a60 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
23a70 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
23a80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
23a90 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
23aa0 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
23ab0 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
23ac0 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
23ad0 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
23ae0 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
23af0 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
23b00 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
23b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
23b20 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
23b30 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
23b40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
23b50 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
23b60 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  allocation is de
23b70 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
23b80 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69   column cache li
23b90 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20  ne that uses.** 
23ba0 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63  the register bec
23bb0 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76  omes stale..*/.v
23bc0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
23bd0 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  seTempReg(Parse 
23be0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
23bf0 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26  g){.  if( iReg &
23c00 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  & pParse->nTempR
23c10 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
23c20 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
23c30 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23c40 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
23c50 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d  e *p;.    for(i=
23c60 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
23c70 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
23c80 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
23c90 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , p++){.      if
23ca0 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
23cb0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65  ){.        p->te
23cc0 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  mpReg = 1;.     
23cd0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
23ce0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
23cf0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
23d00 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
23d10 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  ] = iReg;.  }.}.
23d20 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
23d30 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20  or deallocate a 
23d40 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f  block of nReg co
23d50 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
23d60 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ers.*/.int sqlit
23d70 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50  e3GetTempRange(P
23d80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23d90 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
23da0 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73  , n;.  i = pPars
23db0 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->iRangeReg;.  
23dc0 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  n = pParse->nRan
23dd0 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65  geReg;.  if( nRe
23de0 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  g<=n ){.    asse
23df0 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  rt( !usedAsColum
23e00 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
23e10 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20  , i+n-1) );.    
23e20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
23e30 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  g += nReg;.    p
23e40 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
23e50 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73   -= nReg;.  }els
23e60 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  e{.    i = pPars
23e70 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
23e80 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
23e90 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Reg;.  }.  retur
23ea0 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  n i;.}.void sqli
23eb0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
23ec0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
23ed0 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
23ee0 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65   nReg){.  sqlite
23ef0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
23f00 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
23f10 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67  Reg);.  if( nReg
23f20 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
23f30 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
23f40 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
23f50 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
23f60 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
23f70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
23f80 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
23f90 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
23fa0 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
23fb0 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76   for reuse..*/.v
23fc0 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
23fd0 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72  TempRegCache(Par
23fe0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
23ff0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
24000 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
24010 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a  RangeReg = 0;.}.