/ Hex Artifact Content
Login

Artifact 671a2a43c17a0cfe4bc2c762e56d0f8b0cffb058:


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 70 45 78  .    assert( pEx
0500: 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73  pr->flags&EP_xIs
0510: 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65  Select );.    re
0520: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0530: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0540: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
0550: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0560: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
0570: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69  TE_OMIT_CAST.  i
0580: 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29  f( op==TK_CAST )
0590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
05a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
05b0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
05c0: 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e) );.    return
05d0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
05e0: 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
05f0: 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  oken, 0);.  }.#e
0600: 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d 3d  ndif.  if( (op==
0610: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c  TK_AGG_COLUMN ||
0620: 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c   op==TK_COLUMN |
0630: 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  | op==TK_REGISTE
0640: 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72 2d  R) .   && pExpr-
0650: 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20 20  >pTab!=0.  ){.  
0660: 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    /* op==TK_REGI
0670: 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 70  STER && pExpr->p
0680: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
0690: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
06a0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  iginally.    ** 
06b0: 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20  a TK_COLUMN but 
06c0: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65  was previously e
06d0: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63  valuated and cac
06e0: 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65  hed in a registe
06f0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d  r */.    int j =
0700: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
0710: 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72  .    if( j<0 ) r
0720: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0730: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61 73  _INTEGER;.    as
0740: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54 61  sert( pExpr->pTa
0750: 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70 54  b && j<pExpr->pT
0760: 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
0770: 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 54  return pExpr->pT
0780: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
0790: 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nity;.  }.  retu
07a0: 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  rn pExpr->affini
07b0: 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ty;.}../*.** Set
07c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
07d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70 72  equence for expr
07e0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20  ession pExpr to 
07f0: 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  be the collating
0800: 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  .** sequence nam
0810: 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20 20  ed by pToken.   
0820: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
0830: 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20 6e   to a new Expr n
0840: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  ode that.** impl
0850: 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c 41  ements the COLLA
0860: 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
0870: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
0880: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
0890: 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61 63  occurs, that fac
08a0: 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  t is recorded in
08b0: 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20 61   pParse->db.** a
08c0: 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61 72  nd the pExpr par
08d0: 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72 6e  ameter is return
08e0: 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ed unchanged..*/
08f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0900: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0910: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
0920: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se,           /*
0930: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
0940: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
0950: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
0960: 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c 41  * Add the "COLLA
0970: 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74 68  TE" clause to th
0980: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
0990: 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  .  const Token *
09a0: 70 43 6f 6c 6c 4e 61 6d 65 20 20 20 2f 2a 20 4e  pCollName   /* N
09b0: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
09c0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 29 7b 0a   sequence */.){.
09d0: 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d    if( pCollName-
09e0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  >n>0 ){.    Expr
09f0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
0a00: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
0a10: 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45  ->db, TK_COLLATE
0a20: 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31 29 3b  , pCollName, 1);
0a30: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
0a40: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65  .      pNew->pLe
0a50: 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ft = pExpr;.    
0a60: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
0a70: 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50 5f 53   EP_Collate|EP_S
0a80: 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78 70 72  kip;.      pExpr
0a90: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
0aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0ab0: 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c 69 74  r;.}.Expr *sqlit
0ac0: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
0ad0: 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a 70 50  String(Parse *pP
0ae0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0af0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
0b00: 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b 0a 20  C){.  Token s;. 
0b10: 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30 20 29   assert( zC!=0 )
0b20: 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a 20 20  ;.  s.z = zC;.  
0b30: 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  s.n = sqlite3Str
0b40: 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20 72 65  len30(s.z);.  re
0b50: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0b60: 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28  AddCollateToken(
0b70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
0b80: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69  s);.}../*.** Ski
0b90: 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f  p over any TK_CO
0ba0: 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53 20 6f  LLATE or TK_AS o
0bb0: 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61 6e 79  perators and any
0bc0: 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f   unlikely().** o
0bd0: 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 66  r likelihood() f
0be0: 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65 20 72  unction at the r
0bf0: 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  oot of an expres
0c00: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
0c10: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0c20: 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45 78 70  llate(Expr *pExp
0c30: 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45 78  r){.  while( pEx
0c40: 70 72 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  pr && ExprHasPro
0c50: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0c60: 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69 66 28  Skip) ){.    if(
0c70: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0c80: 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b  (pExpr, EP_Unlik
0c90: 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ely) ){.      as
0ca0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
0cb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0cc0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
0cd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
0ce0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
0cf0: 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  pr>0 );.      as
0d00: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
0d10: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  =TK_FUNCTION );.
0d20: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 45        pExpr = pE
0d30: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
0d40: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 65  0].pExpr;.    }e
0d50: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
0d60: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
0d70: 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45 78 70  _COLLATE || pExp
0d80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 3b 0a  r->op==TK_AS );.
0d90: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 45        pExpr = pE
0da0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
0db0: 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75 72  }.  }   .  retur
0dc0: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
0dd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
0de0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
0df0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0e00: 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20  on pExpr. If.** 
0e10: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69  there is no defi
0e20: 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ned collating se
0e30: 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e  quence, return N
0e40: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ULL..**.** The c
0e50: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0e60: 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65 72  e might be deter
0e70: 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c 41  mined by a COLLA
0e80: 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 6f  TE operator.** o
0e90: 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e 63  r by the presenc
0ea0: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69  e of a column wi
0eb0: 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f 6c  th a defined col
0ec0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
0ed0: 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  .** COLLATE oper
0ee0: 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73 74  ators take first
0ef0: 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c 65   precedence.  Le
0f00: 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b 65  ft operands take
0f10: 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20 6f  .** precedence o
0f20: 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e  ver right operan
0f30: 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ds..*/.CollSeq *
0f40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
0f50: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
0f60: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
0f70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
0f80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43 6f  pParse->db;.  Co
0f90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0fa0: 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45  ;.  Expr *p = pE
0fb0: 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  xpr;.  while( p 
0fc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
0fd0: 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  p->op;.    if( p
0fe0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65 6e  ->flags & EP_Gen
0ff0: 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  eric ) break;.  
1000: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53    if( op==TK_CAS
1010: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55  T || op==TK_UPLU
1020: 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70  S ){.      p = p
1030: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 63  ->pLeft;.      c
1040: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1050: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 4f     if( op==TK_CO
1060: 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54 4b  LLATE || (op==TK
1070: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
1080: 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 29  op2==TK_COLLATE)
1090: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
10a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
10b0: 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43 28  Seq(pParse, ENC(
10c0: 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54 6f  db), 0, p->u.zTo
10d0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
10e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
10f0: 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20 20   p->pTab!=0.    
1100: 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f   && (op==TK_AGG_
1110: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
1120: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
1130: 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49    || op==TK_REGI
1140: 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54  STER || op==TK_T
1150: 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a 20  RIGGER).    ){. 
1160: 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52       /* op==TK_R
1170: 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54  EGISTER && p->pT
1180: 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68  ab!=0 happens wh
1190: 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69  en pExpr was ori
11a0: 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ginally.      **
11b0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
11c0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
11d0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
11e0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
11f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  er */.      int 
1200: 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  j = p->iColumn;.
1210: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20 29        if( j>=0 )
1220: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1230: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 2d  char *zColl = p-
1240: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  >pTab->aCol[j].z
1250: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Coll;.        pC
1260: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1270: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1280: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12b0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
12c0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
12d0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d     if( ALWAYS(p-
12e0: 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e 70  >pLeft) && (p->p
12f0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1300: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1310: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1320: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1330: 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e{.        p = p
1340: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1350: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1370: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1380: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1390: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
13a0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
13b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
13c0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
13d0: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
13e0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
13f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
1400: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
1410: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
1420: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
1430: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1440: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1450: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1460: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1470: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1480: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1490: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
14a0: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
14b0: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
14c0: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
14d0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
14e0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
14f0: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
1500: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
1510: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
1520: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
1530: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1540: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1550: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1560: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1570: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1580: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1590: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
15a0: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
15b0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
15c0: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
15d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15e0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
15f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1600: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1610: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  AFF_NONE;.    }.
1620: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1630: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1640: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1650: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1660: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1670: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1680: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
1690: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
16a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16b0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
16c0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
16d0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
16e0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
16f0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
1700: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
1710: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
1720: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
1730: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1740: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1750: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1760: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1770: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1780: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
1790: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
17a0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
17b0: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
17c0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
17d0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
17e0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
17f0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1800: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1810: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1820: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1830: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1840: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1850: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1860: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1870: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1880: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
1890: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
18a0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
18b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
18c0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
18d0: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
18e0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
18f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1900: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1910: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1920: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1930: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1940: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1950: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1960: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1970: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1980: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
1990: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19a0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
19b0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
19c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
19d0: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
19e0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
19f0: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1a00: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1a10: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1a20: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1a50: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1a60: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1a70: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1a80: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
1a90: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
1aa0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
1ab0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
1ac0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
1ad0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
1ae0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1af0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1b00: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1b10: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1b20: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1b30: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1b40: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1b50: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1b60: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1b70: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1b80: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1b90: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1ba0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bb0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
1bc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1bd0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1be0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1bf0: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1c00: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1c10: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1c20: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1c30: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1c40: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1c50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c60: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1c70: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1c80: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1c90: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1ca0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1cb0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1cc0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1cd0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1cf0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1d00: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1d10: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1d20: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1d30: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1d40: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1d50: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1d60: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
1d70: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1d80: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
1d90: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1da0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1db0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1dc0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1dd0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1de0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1df0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1e00: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1e10: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1e20: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1e30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1e40: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1e50: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1e60: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1e70: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1e80: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1e90: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1ea0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
1eb0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
1ec0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1ed0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1ee0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1ef0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1f00: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1f10: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1f20: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1f30: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1f40: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1f50: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1f60: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1f70: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1f80: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1f90: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1fa0: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
1fb0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
1fc0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
1fd0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
1fe0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
1ff0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
2000: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
2010: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
2020: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2030: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2040: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2050: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2060: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
2070: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2080: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
2090: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
20b0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
20c0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
20d0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
20e0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
20f0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2100: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
2110: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2120: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
2130: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2140: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2150: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2160: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2170: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2180: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2190: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
21a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
21b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
21c0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
21d0: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
21e0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
21f0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
2200: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2210: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
2220: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
2230: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2240: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2250: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2260: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2270: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2280: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
2290: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
22a0: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
22b0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
22c0: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
22d0: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
22e0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
22f0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
2300: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
2310: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
2320: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
2330: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2340: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2350: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2360: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2370: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2380: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
2390: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
23a0: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
23b0: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
23c0: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
23d0: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
23e0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
2400: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
2410: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
2420: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
2430: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2440: 35 29 3b 0a 20 20 69 66 28 20 70 35 21 3d 53 51  5);.  if( p5!=SQ
2450: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
2460: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2470: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
2480: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c  nge(pParse, in1,
2490: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
24a0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
24b0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
24c0: 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  in2, 1);.  }.  r
24d0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
24e0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
24f0: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
2500: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
2510: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
2520: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2530: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2540: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
2550: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
2560: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
2570: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
2580: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
2590: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25a0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
25b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
25c0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
25d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25e0: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
25f0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
2600: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2610: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
2620: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
2630: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
2640: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2650: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
2660: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
2670: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
2680: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
2690: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
26a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
26b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
26c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
26d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
26e0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
26f0: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
2700: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2710: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
2720: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
2730: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2740: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2750: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
2760: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
2770: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
2780: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2790: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
27a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
27b0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
27c0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
27d0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
27e0: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
27f0: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
2800: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
2810: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
2820: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
2830: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
2840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
2850: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
2860: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2870: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2880: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
2890: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
28a0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
28b0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
28c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
28d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
28e0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
28f0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2900: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2910: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2920: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2930: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
2940: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
2950: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
2960: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2970: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2980: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
2990: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
29a0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
29b0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
29c0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
29d0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
29e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
29f0: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
2a00: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2a10: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
2a20: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2a30: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
2a40: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
2a50: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2a60: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
2a70: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2a80: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2a90: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
2aa0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2ab0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2ac0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
2ad0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2ae0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
2af0: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
2b00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
2b10: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
2b20: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
2b30: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2b40: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
2b50: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
2b60: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
2b70: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
2b80: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
2b90: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
2ba0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
2bb0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
2bc0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
2bd0: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
2be0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2bf0: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
2c00: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
2c10: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74   plus one..*/.st
2c20: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65  atic void exprSe
2c30: 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29  tHeight(Expr *p)
2c40: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
2c50: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  = 0;.  heightOfE
2c60: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e  xpr(p->pLeft, &n
2c70: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
2c80: 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68  tOfExpr(p->pRigh
2c90: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
2ca0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
2cb0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
2cc0: 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67  ect) ){.    heig
2cd0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e  htOfSelect(p->x.
2ce0: 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68  pSelect, &nHeigh
2cf0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
2d20: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70  Height);.  }.  p
2d30: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
2d40: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
2d50: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
2d60: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
2d70: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
2d80: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
2d90: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
2da0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
2db0: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
2dc0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
2dd0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
2de0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
2df0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
2e00: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2e10: 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72  ight(Parse *pPar
2e20: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
2e30: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 29  exprSetHeight(p)
2e40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2e50: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
2e60: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
2e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e80: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
2e90: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
2ea0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
2eb0: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
2ec0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
2ed0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
2ee0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
2ef0: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2f00: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
2f10: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
2f20: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
2f30: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
2f40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
2f50: 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20  ight;.}.#else.  
2f60: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
2f70: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
2f80: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
2f90: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
2fa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2fb0: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
2fc0: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
2fd0: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
2fe0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
2ff0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
3000: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
3010: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
3020: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
3030: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
3040: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
3050: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
3060: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
3070: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
3080: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
3090: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
30a0: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
30b0: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
30c0: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
30d0: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
30e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
30f0: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
3100: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
3110: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
3120: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
3130: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
3140: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
3150: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65  erformance.  The
3160: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
3170: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
3180: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
3190: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
31a0: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
31b0: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
31c0: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
31d0: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
31e0: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
31f0: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
3200: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
3210: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
3220: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3230: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
3240: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
3250: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
3260: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
3270: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
3280: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
3290: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
32a0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
32b0: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
32c0: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
32d0: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
32e0: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
32f0: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
3300: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
3310: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
3320: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
3330: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
3340: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
3350: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
3360: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
3370: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
3380: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
3390: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
33a0: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
33b0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
33c0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
33d0: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
33e0: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
33f0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
3400: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
3410: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
3420: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
3430: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
3440: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
3450: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
3460: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
3470: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
3480: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3490: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
34a0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
34b0: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
34c0: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
34d0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
34e0: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
34f0: 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65  INTEGER || pToke
3500: 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  n->z==0.        
3510: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
3520: 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  nt32(pToken->z, 
3530: 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20  &iValue)==0 ){. 
3540: 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54       nExtra = pT
3550: 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20  oken->n+1;.     
3560: 20 61 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e   assert( iValue>
3570: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
3580: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
3590: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
35a0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45   sizeof(Expr)+nE
35b0: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65  xtra);.  if( pNe
35c0: 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  w ){.    pNew->o
35d0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
35e0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
35f0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
3600: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
3610: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
3620: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3630: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
3640: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
3650: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
3660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3670: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
3680: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3690: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
36a0: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
36b0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
36c0: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
36d0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
36e0: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
36f0: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
3700: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
3710: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
3720: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3730: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
3740: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
3750: 71 75 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e  quote && nExtra>
3760: 3d 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =3 .            
3770: 20 26 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e   && ((c = pToken
3780: 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c  ->z[0])=='\'' ||
3790: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b   c=='"' || c=='[
37a0: 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a  ' || c=='`') ){.
37b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
37c0: 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Dequote(pNew->u
37d0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
37e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29      if( c=='"' )
37f0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
3800: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
3810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3820: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
3830: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
3840: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
3850: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
3860: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
3870: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
3880: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
3890: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
38a0: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
38b0: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
38c0: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
38d0: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
38e0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
38f0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3910: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3920: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3930: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3940: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3960: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3970: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3980: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
3990: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
39a0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
39b0: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
39c0: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
39d0: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
39e0: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
39f0: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
3a00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
3a10: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
3a20: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
3a30: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
3a40: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
3a50: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
3a60: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
3a70: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
3a80: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
3a90: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
3aa0: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
3ab0: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
3ac0: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
3ad0: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
3ae0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
3af0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
3b00: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3b10: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3b20: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
3b30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
3b40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
3b50: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
3b60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
3b70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3b80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
3b90: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
3ba0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
3bb0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3bc0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
3bd0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
3be0: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3bf0: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
3c00: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
3c10: 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74  ags |= EP_Collat
3c20: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
3c30: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
3c40: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
3c50: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
3c60: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
3c70: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  t->flags |= EP_C
3c80: 6f 6c 6c 61 74 65 20 26 20 70 4c 65 66 74 2d 3e  ollate & pLeft->
3c90: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
3ca0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
3cb0: 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Root);.  }.}../*
3cc0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 45  .** Allocate a E
3cd0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
3ce0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
3cf0: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
3d00: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
3d10: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
3d20: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
3d30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3d40: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
3d50: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
3d60: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
3d70: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
3d80: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3d90: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
3da0: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
3db0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
3dc0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
3dd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
3df0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3e00: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e20: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e30: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3e50: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
3e60: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
3e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
3e80: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  t operand */.  c
3e90: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
3ea0: 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  en     /* Argume
3eb0: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  nt token */.){. 
3ec0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
3ed0: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 4c  op==TK_AND && pL
3ee0: 65 66 74 20 26 26 20 70 52 69 67 68 74 20 29 7b  eft && pRight ){
3ef0: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76  .    /* Take adv
3f00: 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d  antage of short-
3f10: 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70  circuit false op
3f20: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41  timization for A
3f30: 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71  ND */.    p = sq
3f40: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
3f50: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20  rse->db, pLeft, 
3f60: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
3f70: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
3f80: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
3f90: 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65  e->db, op, pToke
3fa0: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
3fb0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3fc0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3fd0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3fe0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
3ff0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
4000: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
4010: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
4020: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4030: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   p;.}../*.** If 
4040: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4050: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
4060: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
4070: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
4080: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
4090: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
40a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
40b0: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
40c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
40d0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
40e0: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
40f0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
4100: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
4110: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
4120: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
4130: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
4140: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
4150: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
4160: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
4170: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
4180: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
4190: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
41a0: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
41b0: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
41c0: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
41d0: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
41e0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
41f0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
4200: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
4210: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
4220: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
4230: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
4240: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
4250: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
4260: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
4270: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
4280: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
4290: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
42a0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
42b0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
42c0: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
42d0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
42e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
42f0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
4300: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
4310: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
4320: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
4330: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4340: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
4350: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
4360: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
4370: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
4380: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4390: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
43a0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
43b0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
43c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
43d0: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
43e0: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
43f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
4400: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
4410: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
4420: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
4430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
4440: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
4450: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
4460: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
4470: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
4480: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4490: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
44a0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
44b0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
44c0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
44d0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
44e0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
44f0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
4500: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
4510: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
4520: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
4530: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
4540: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
4550: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
4560: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
4570: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
4580: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
4590: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
45a0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
45b0: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
45c0: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
45d0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
45e0: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
45f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4600: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
4610: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4620: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
4630: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
4640: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4650: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
4660: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
4670: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
4680: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
4690: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
46a0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
46b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
46c0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
46d0: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
46e0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
46f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
4700: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
4710: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
4720: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
4730: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
4740: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
4750: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
4760: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
4770: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
4780: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4790: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
47a0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
47b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
47c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
47d0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
47e0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
47f0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4800: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4810: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4820: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4830: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4840: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4850: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
4860: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
4870: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
4880: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
4890: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
48a0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
48b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
48c0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
48d0: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
48e0: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
48f0: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4900: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4910: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
4920: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
4930: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
4940: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
4950: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
4960: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
4970: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
4980: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
4990: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
49a0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
49b0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
49c0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
49d0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
49e0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
49f0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4a00: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4a10: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
4a20: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
4a30: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
4a40: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
4a50: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
4a60: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
4a70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
4a80: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
4a90: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
4aa0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
4ab0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4ac0: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4ad0: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4ae0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4af0: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4b00: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4b10: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4b20: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4b30: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
4b40: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
4b50: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
4b60: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
4b70: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
4b80: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
4b90: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
4ba0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
4bb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4bc0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71  pr *pExpr){.  sq
4bd0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4be0: 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20  se->db;.  const 
4bf0: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
4c00: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4c10: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  n;.  assert( !Ex
4c20: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
4c30: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
4c40: 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  |EP_Reduced|EP_T
4c50: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a  okenOnly) );.  z
4c60: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
4c70: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21  en;.  assert( z!
4c80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4c90: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
4ca0: 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   z[1]==0 ){.    
4cb0: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
4cc0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
4cd0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
4ce0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
4cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30  .    assert( z[0
4d00: 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45  ]=='?' );.    pE
4d10: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
4d20: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
4d30: 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nVar);.  }else{
4d40: 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30  .    ynVar x = 0
4d50: 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71  ;.    u32 n = sq
4d60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
4d70: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
4d80: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '?' ){.      /* 
4d90: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
4da0: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
4db0: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
4dc0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
4dd0: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
4de0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
4df0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36  mber */.      i6
4e00: 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  4 i;.      int b
4e10: 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41  Ok = 0==sqlite3A
4e20: 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c  toi64(&z[1], &i,
4e30: 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46   n-1, SQLITE_UTF
4e40: 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  8);.      pExpr-
4e50: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
4e60: 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74  ynVar)i;.      t
4e70: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
4e80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4e90: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
4ea0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
4eb0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4ec0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4ed0: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
4ee0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
4ef0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4f00: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4f10: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
4f20: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
4f30: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
4f40: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4f50: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4f70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4f80: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
4f90: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
4fa0: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4fc0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4fd0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4fe0: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78  BER]);.        x
4ff0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
5000: 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65      if( i>pParse
5010: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
5020: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
5030: 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d   (int)i;.      }
5040: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5050: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c    /* Wildcards l
5060: 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61  ike ":aaa", "$aa
5070: 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52  a" or "@aaa".  R
5080: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
5090: 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  riable.      ** 
50a0: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72  number as the pr
50b0: 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f  ior appearance o
50c0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c  f the same name,
50d0: 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a   or if the name.
50e0: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76        ** has nev
50f0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
5100: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
5110: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
5120: 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  er.      */.    
5130: 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20    ynVar i;.     
5140: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
5150: 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b  se->nzVar; i++){
5160: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
5170: 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26  rse->azVar[i] &&
5180: 20 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e   strcmp(pParse->
5190: 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29  azVar[i],z)==0 )
51a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
51b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d  r->iColumn = x =
51c0: 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20   (ynVar)i+1;.   
51d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
51e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
51f0: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29        if( x==0 )
5200: 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   x = pExpr->iCol
5210: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
5220: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
5230: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30     }.    if( x>0
5240: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e   ){.      if( x>
5250: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b  pParse->nzVar ){
5260: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a  .        char **
5270: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73  a;.        a = s
5280: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
5290: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  db, pParse->azVa
52a0: 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d  r, x*sizeof(a[0]
52b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
52c0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  a==0 ) return;  
52d0: 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65  /* Error reporte
52e0: 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61  d through db->ma
52f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20  llocFailed */.  
5300: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
5310: 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  Var = a;.       
5320: 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73   memset(&a[pPars
5330: 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78  e->nzVar], 0, (x
5340: 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a  -pParse->nzVar)*
5350: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
5360: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
5370: 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20  zVar = x;.      
5380: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  }.      if( z[0]
5390: 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d  !='?' || pParse-
53a0: 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29  >azVar[x-1]==0 )
53b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
53c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72  3DbFree(db, pPar
53d0: 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b  se->azVar[x-1]);
53e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
53f0: 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71  >azVar[x-1] = sq
5400: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
5410: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  b, z, n);.      
5420: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
5430: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
5440: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
5450: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
5460: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
5470: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
5480: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5490: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
54a0: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
54b0: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
54c0: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
54d0: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
54e0: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
54f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5500: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
5510: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
5520: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5530: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a  /* Sanity check:
5540: 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
5550: 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e   IntValue is non
5560: 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20  -negative if it 
5570: 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65  exists */.  asse
5580: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
5590: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
55a0: 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61  lue) || p->u.iVa
55b0: 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  lue>=0 );.  if( 
55c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
55d0: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
55e0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
55f0: 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20  Expr.x union is 
5600: 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68  never used at th
5610: 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45  e same time as E
5620: 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20  xpr.pRight */.  
5630: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70    assert( p->x.p
5640: 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  List==0 || p->pR
5650: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ight==0 );.    s
5660: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5670: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  (db, p->pLeft);.
5680: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5690: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69  elete(db, p->pRi
56a0: 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
56b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
56c0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20   EP_MemToken) ) 
56d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
56e0: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
56f0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
5700: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5710: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5720: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
5730: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
5740: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
5750: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
5760: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5770: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
5780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5790: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
57a0: 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20  y(p, EP_Static) 
57b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
57c0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
57d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
57e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
57f0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
5800: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
5810: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
5820: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5830: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
5840: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
5850: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
5860: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
5870: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
5880: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
5890: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
58a0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
58b0: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
58c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
58d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
58e0: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
58f0: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
5900: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5910: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
5920: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
5930: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
5940: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
5950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
5960: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
5970: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
5980: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5990: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
59a0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
59b0: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
59c0: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
59d0: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
59e0: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
59f0: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
5a00: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
5a10: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5a20: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
5a30: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
5a40: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
5a50: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
5a60: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
5a70: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
5a80: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
5a90: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
5aa0: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
5ab0: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
5ac0: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
5ad0: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
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 2a 2a 2a 2a 2a  ****************
5b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b20: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
5b30: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5b40: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
5b50: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
5b60: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
5b70: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
5b80: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
5b90: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
5ba0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
5bb0: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
5bc0: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
5bd0: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
5be0: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
5bf0: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
5c00: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
5c10: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
5c20: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
5c30: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
5c40: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
5c50: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
5c60: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
5c70: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5c80: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
5c90: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
5ca0: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
5cb0: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
5cc0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
5cd0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
5ce0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
5cf0: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
5d00: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
5d10: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
5d20: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
5d30: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
5d40: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
5d50: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
5d60: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
5d70: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
5d80: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
5d90: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
5da0: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
5db0: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
5dc0: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
5dd0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
5de0: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
5df0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
5e00: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
5e10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
5e20: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
5e30: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
5e40: 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72  arts of teh Expr
5e50: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
5e60: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
5e70: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
5e80: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
5e90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
5ea0: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
5eb0: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
5ec0: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
5ed0: 20 6d 61 6b 65 20 61 20 45 58 50 52 44 55 50 5f   make a EXPRDUP_
5ee0: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
5ef0: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
5f00: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
5f10: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
5f20: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
5f30: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
5f40: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
5f50: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
5f60: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
5f70: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
5f80: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
5f90: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
5fa0: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
5fb0: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
5fc0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
5fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
5fe0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5ff0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6000: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
6010: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
6020: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
6030: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
6040: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
6050: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
6060: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
6070: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
6080: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
6090: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
60a0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
60b0: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
60c0: 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52  ( 0==(flags&EXPR
60d0: 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20  DUP_REDUCE) ){. 
60e0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
60f0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
6100: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
6110: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6120: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
6130: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
6140: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6150: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6160: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
6170: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
6180: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6190: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
61a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
61b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
61c0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
61d0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
61e0: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
61f0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
6200: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6210: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
6220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6230: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
6240: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
6250: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
6260: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
6270: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
6280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
6290: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
62a0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
62b0: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
62c0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
62d0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
62e0: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
62f0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
6300: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
6310: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
6320: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
6330: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
6340: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6350: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6360: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
6370: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
6380: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6390: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
63a0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
63b0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
63c0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
63d0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
63e0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
63f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6400: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6420: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6430: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6440: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6450: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
6460: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
6470: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
6480: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
6490: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
64a0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
64b0: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
64c0: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
64d0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
64e0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
64f0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6500: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6510: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6520: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6530: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6540: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6550: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
6560: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
6570: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6580: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6590: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
65a0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
65b0: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
65c0: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
65d0: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
65e0: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
65f0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6600: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6610: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6620: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6630: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6640: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6650: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
6660: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
6670: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
6680: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
6690: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
66a0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
66b0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
66c0: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
66d0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
66e0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
66f0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6700: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6710: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6720: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6730: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6740: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6750: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
6760: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
6770: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6780: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
6790: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
67a0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
67b0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
67c0: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
67d0: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
67e0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
67f0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6800: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6810: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6820: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6830: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6840: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6850: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
6860: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
6870: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
6880: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
6890: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
68a0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
68b0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
68c0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
68d0: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
68e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
68f0: 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20  e passed the.** 
6900: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
6910: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
6920: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
6930: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
6940: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
6950: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
6960: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20  , int flags, u8 
6970: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
6980: 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  xpr *pNew = 0;  
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
69b0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20  return */.  if( 
69c0: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
69d0: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
69e0: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
69f0: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6a00: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6a10: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6a20: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6a30: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6a40: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
6a50: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
6a60: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
6a70: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
6a80: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
6a90: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
6aa0: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
6ab0: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
6ac0: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
6ad0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6ae0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
6af0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6b00: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
6b10: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
6b20: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
6b30: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
6b40: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
6b50: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
6b60: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
6b70: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
6b80: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
6b90: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
6ba0: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
6bb0: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
6bc0: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
6bd0: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
6be0: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
6bf0: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
6c00: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6c10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
6c20: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
6c30: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
6c40: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
6c50: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
6c60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
6c70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
6c80: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
6c90: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
6ca0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
6cb0: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
6cc0: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
6cd0: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20   & 0xfff;.      
6ce0: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
6cf0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
6d00: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
6d10: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
6d20: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  Token ){.       
6d30: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
6d40: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
6d50: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
6d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d70: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
6d80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
6d90: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
6da0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
6db0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6dc0: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
6dd0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6de0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
6df0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
6e00: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
6e10: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
6e20: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
6e30: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6e40: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
6e50: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
6e60: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
6e70: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
6e80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
6e90: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
6ea0: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
6eb0: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
6ec0: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
6ed0: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
6ee0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6ef0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
6f00: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
6f10: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
6f20: 65 6e 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  en);.      pNew-
6f30: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
6f40: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
6f50: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
6f60: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
6f70: 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c  lags |= staticFl
6f80: 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  ag;..      /* Co
6f90: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
6fa0: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
6fb0: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
6fc0: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
6fd0: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d    char *zToken =
6fe0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6ff0: 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63  = (char*)&zAlloc
7000: 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20  [nNewSize];.    
7010: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
7020: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
7030: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  nToken);.      }
7040: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
7050: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
7060: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
7070: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7080: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
7090: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
70a0: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
70b0: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
70c0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
70d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
70e0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
70f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
7100: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7110: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
7120: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65  >x.pSelect, isRe
7130: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
7140: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7150: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
7160: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7170: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
7180: 73 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  st, isReduced);.
7190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
71a0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  }..      /* Fill
71b0: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
71c0: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
71d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
71e0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
71f0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
7200: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7210: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
7220: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
7230: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
7240: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
7250: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7260: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
7270: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7280: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
7290: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
72a0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
72b0: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
72c0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
72d0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
72e0: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
72f0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
7300: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7310: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
7320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
7330: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
7340: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7360: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
7370: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
7380: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
7390: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
73a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
73b0: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
73c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  0);.          pN
73d0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
73e0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
73f0: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
7400: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7410: 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ..    }.  }.  re
7420: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7430: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
7440: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
7450: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
7460: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
7470: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
7480: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
7490: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
74a0: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
74b0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
74c0: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
74d0: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
74e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
74f0: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
7500: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
7510: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
7520: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
7530: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
7540: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
7550: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
7560: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
7570: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
7580: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
7590: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
75a0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
75b0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
75c0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
75d0: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
75e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
75f0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
7600: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
7610: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
7620: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7630: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
7640: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
7650: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
7660: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
7670: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
7680: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
7690: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
76a0: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
76b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
76c0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
76d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
76e0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
76f0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
7700: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
7710: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
7720: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
7730: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
7740: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
7750: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
7760: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
7770: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
7780: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
7790: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
77a0: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
77b0: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
77c0: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
77d0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
77e0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
77f0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
7800: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
7810: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
7820: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
7830: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
7840: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
7850: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
7860: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
7870: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
7880: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
7890: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
78a0: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
78b0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
78c0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
78d0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
78e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
78f0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
7900: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
7910: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
7920: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
7930: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
7940: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
7950: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
7960: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
7970: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
7980: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
7990: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
79a0: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
79b0: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
79c0: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
79d0: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
79e0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
79f0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
7a00: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
7a10: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
7a20: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7a30: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
7a40: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
7a50: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
7a60: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
7a70: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
7a80: 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64 62  eturn exprDup(db
7a90: 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  , p, flags, 0);.
7aa0: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
7ab0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
7ac0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7ad0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7ae0: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
7af0: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
7b00: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
7b10: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
7b20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7b30: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7b50: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7b60: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
7b70: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7b80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7b90: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20  ew->nExpr = i = 
7ba0: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  p->nExpr;.  if( 
7bb0: 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50  (flags & EXPRDUP
7bc0: 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f  _REDUCE)==0 ) fo
7bd0: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=1; i<p->nExp
7be0: 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65  r; i+=i){}.  pNe
7bf0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
7c00: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7c10: 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28  w(db,  i*sizeof(
7c20: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
7c30: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
7c40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7c50: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
7c60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
7c70: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
7c80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7c90: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
7ca0: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
7cb0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
7cc0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
7cd0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  ->pExpr;.    pIt
7ce0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
7cf0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7d00: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
7d10: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
7d20: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7d30: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7d40: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
7d50: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
7d60: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7d70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
7d80: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
7d90: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
7da0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
7db0: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
7dc0: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
7dd0: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
7de0: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
7df0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
7e00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
7e10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
7e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
7e30: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
7e40: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
7e50: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
7e60: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
7e70: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
7e80: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7e90: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
7ea0: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
7eb0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
7ec0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
7ed0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7ee0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
7ef0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
7f00: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
7f10: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
7f20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
7f30: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7f40: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
7f50: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
7f60: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
7f70: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
7f80: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
7f90: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7fa0: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
7fb0: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
7fc0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
7fd0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
7fe0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7ff0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
8000: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
8010: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
8020: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
8030: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
8040: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8050: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
8060: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
8070: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8080: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
8090: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
80a0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
80b0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
80c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
80d0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
80e0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
80f0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
8100: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
8110: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
8120: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
8130: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
8140: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
8150: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
8160: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
8170: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
8180: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8190: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
81a0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
81b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
81c0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
81d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
81e0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
81f0: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
8200: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8210: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
8220: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
8230: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
8240: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
8250: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
8260: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
8270: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
8280: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
8290: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
82a0: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
82b0: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
82c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
82d0: 74 75 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74  turn;.    pNewIt
82e0: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
82f0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43   = pOldItem->isC
8300: 6f 72 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70  orrelated;.    p
8310: 4e 65 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  NewItem->viaCoro
8320: 75 74 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d  utine = pOldItem
8330: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a  ->viaCoroutine;.
8340: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
8350: 52 65 63 75 72 73 69 76 65 20 3d 20 70 4f 6c 64  Recursive = pOld
8360: 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  Item->isRecursiv
8370: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
8380: 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
8390: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
83a0: 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b  ldItem->zIndex);
83b0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e  .    pNewItem->n
83c0: 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64  otIndexed = pOld
83d0: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
83e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
83f0: 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  pIndex = pOldIte
8400: 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  m->pIndex;.    p
8410: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
8420: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
8430: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
8440: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
8450: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
8460: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
8470: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
8480: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
8490: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
84a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
84b0: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
84c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
84d0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
84e0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
84f0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
8500: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
8510: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
8520: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
8530: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
8540: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
8550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
8560: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
8570: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
8580: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
8590: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
85a0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
85b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
85c0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
85d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
85e0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
85f0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
8600: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8610: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
8620: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
8630: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
8640: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e  llocRaw(db, p->n
8650: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
8660: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
8670: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
8680: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8690: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
86a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
86b0: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
86c0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
86d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
86e0: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
86f0: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
8700: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
8710: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
8720: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
8730: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
8740: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
8750: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
8760: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
8770: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
8780: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
8790: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
87a0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
87b0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
87c0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
87d0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
87e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
87f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
8800: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8810: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
8820: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
8830: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
8840: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
8850: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
8860: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
8870: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
8880: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
8890: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
88a0: 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  , *pPrior;.  if(
88b0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
88c0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
88d0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
88e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
88f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
8900: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8910: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
8920: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
8930: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
8940: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  gs);.  pNew->pSr
8950: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
8960: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
8970: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  c, flags);.  pNe
8980: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
8990: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
89a0: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
89b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
89c0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
89d0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
89e0: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
89f0: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
8a00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8a10: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
8a20: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8a30: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
8a40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8a50: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
8a60: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8a70: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
8a80: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
8a90: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
8aa0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
8ab0: 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20  Prior, flags);. 
8ac0: 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
8ad0: 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
8ae0: 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ew;.  pNew->pNex
8af0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
8b00: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
8b10: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
8b20: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
8b30: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
8b40: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8b50: 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66  b, p->pOffset, f
8b60: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  lags);.  pNew->i
8b70: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
8b80: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->iOffset = 0;.
8b90: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
8ba0: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
8bb0: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
8bc0: 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  al;.  pNew->addr
8bd0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
8be0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
8bf0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
8c00: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
8c10: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
8c20: 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74  ow;.  pNew->pWit
8c30: 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20  h = withDup(db, 
8c40: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 72 65 74  p->pWith);.  ret
8c50: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
8c60: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
8c70: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8c80: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8c90: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8ca0: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
8cb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
8cc0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
8cd0: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
8ce0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
8cf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8d00: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
8d10: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
8d20: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8d30: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
8d40: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ist..**.** If a 
8d50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
8d60: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8d70: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
8d80: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
8d90: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8da0: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
8db0: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
8dc0: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
8dd0: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
8de0: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
8df0: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
8e00: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
8e10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
8e20: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
8e30: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8e40: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8e50: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8e60: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
8e70: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8e80: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
8e90: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
8ea0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
8eb0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
8ec0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
8ed0: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
8ee0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
8ef0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8f00: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73  ->db;.  if( pLis
8f10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
8f20: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
8f30: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
8f40: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
8f50: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
8f60: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
8f70: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
8f80: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
8f90: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8fa0: 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  b, sizeof(pList-
8fb0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
8fc0: 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67   pList->a==0 ) g
8fd0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65  oto no_mem;.  }e
8fe0: 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  lse if( (pList->
8ff0: 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e  nExpr & (pList->
9000: 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a  nExpr-1))==0 ){.
9010: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9020: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
9030: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9040: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
9050: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
9060: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
9070: 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32  , pList->nExpr*2
9080: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
9090: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
90a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
90b0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
90c0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
90d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
90e0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
90f0: 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74   if( 1 ){.    st
9100: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9110: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
9120: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
9130: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
9140: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
9150: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
9160: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
9170: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
9180: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
9190: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
91a0: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
91b0: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
91c0: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
91d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
91e0: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
91f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9200: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
9210: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9220: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
9230: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
9240: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
9250: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9260: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
9270: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9280: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
9290: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
92a0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
92b0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
92c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
92d0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
92e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
92f0: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
9300: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9310: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
9320: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
9330: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
9340: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
9350: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9360: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9370: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9380: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
9390: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
93a0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
93b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
93c0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
93d0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
93e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
93f0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
9400: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
9410: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
9420: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
9430: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
9440: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9450: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
9460: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
9470: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9480: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9490: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
94a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
94b0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
94c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
94d0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
94e0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
94f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
9500: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
9510: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
9520: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
9530: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
9540: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70  if( dequote && p
9550: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71  Item->zName ) sq
9560: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
9570: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
9580: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9590: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
95a0: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
95b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
95c0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
95d0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
95e0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
95f0: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9610: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
9620: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
9630: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9640: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9650: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9660: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9670: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
9680: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
9690: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
96a0: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
96b0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
96c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
96d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
96e0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
96f0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9700: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9710: 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70  pan. */.  ExprSp
9720: 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20  an *pSpan       
9730: 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f    /* The span to
9740: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a   be added */.){.
9750: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9760: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
9770: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
9780: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
9790: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
97a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
97b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
97c0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
97d0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
97e0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
97f0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
9800: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
9810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9820: 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d  || pItem->pExpr=
9830: 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b  =pSpan->pExpr );
9840: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9850: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
9860: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
9870: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
9880: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
9890: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
98a0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
98d0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
98e0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d  n->zStart));.  }
98f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
9900: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9910: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
9920: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
9930: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
9940: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
9950: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
9960: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9970: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
9980: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
9990: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
99a0: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
99b0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
99c0: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
99d0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
99e0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
99f0: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
9a00: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
9a10: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
9a20: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
9a30: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
9a40: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
9a50: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
9a60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
9a70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9a80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9a90: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
9aa0: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
9ab0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9ac0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
9ad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9ae0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9af0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
9b10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
9b20: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
9b30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9b40: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
9b50: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
9b60: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9b70: 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  >a!=0 || pList->
9b80: 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f  nExpr==0 );.  fo
9b90: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
9ba0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
9bb0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
9bc0: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
9bd0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9be0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
9bf0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9c00: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
9c10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
9c20: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
9c30: 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73  >zSpan);.  }.  s
9c40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9c50: 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
9c60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9c70: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
9c80: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
9c90: 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  are Walker callb
9ca0: 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e  acks.  Walker.u.
9cb0: 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a  pi is a pointer.
9cc0: 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ** to an integer
9cd0: 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
9ce0: 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61  s are checking a
9cf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
9d00: 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  see.** if it is 
9d10: 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74  a constant.  Set
9d20: 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f   *Walker.u.pi to
9d30: 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73   0 if the expres
9d40: 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63  sion is.** not c
9d50: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
9d60: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
9d70: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
9d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
9d90: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
9da0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9db0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a  rIsConstant().**
9dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9dd0: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
9de0: 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  n().**     sqlit
9df0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9e00: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a  OrFunction().**.
9e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
9e20: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
9e30: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
9e40: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9e50: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
9e60: 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20  ->u.i is 3 then 
9e70: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
9e80: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
9e90: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
9ea0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
9eb0: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
9ec0: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
9ed0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
9ee0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
9ef0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
9f00: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
9f10: 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45  ker->u.i==3 && E
9f20: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9f30: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
9f40: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
9f50: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
9f60: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
9f70: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
9f80: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
9f90: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
9fa0: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
9fb0: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
9fc0: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
9fd0: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
9fe0: 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61  * and either pWa
9ff0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 6f 72 20  lker->u.i==2 or 
a000: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  the function as 
a010: 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  the SQLITE_FUNC_
a020: 43 4f 4e 53 54 0a 20 20 20 20 2a 2a 20 66 6c 61  CONST.    ** fla
a030: 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  g. */.    case T
a040: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
a050: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
a060: 2e 69 3d 3d 32 20 7c 7c 20 45 78 70 72 48 61 73  .i==2 || ExprHas
a070: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
a080: 50 5f 43 6f 6e 73 74 61 6e 74 29 20 29 7b 0a 20  P_Constant) ){. 
a090: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
a0a0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
a0b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
a0c0: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
a0d0: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
a0e0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a0f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
a100: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
a110: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
a120: 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  N:.      testcas
a130: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
a140: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _ID );.      tes
a150: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a160: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
a170: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a180: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
a190: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
a1a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
a1b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
a1c0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70  OLUMN );.      p
a1d0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
a1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
a1f0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66  C_Abort;.    def
a200: 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74  ault:.      test
a210: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a220: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a  =TK_SELECT ); /*
a230: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
a240: 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c  stant will disal
a250: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  low */.      tes
a260: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a270: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
a280: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
a290: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
a2a0: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  llow */.      re
a2b0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
a2c0: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
a2d0: 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  int selectNodeIs
a2e0: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
a2f0: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
a300: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
a310: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
a320: 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b  otUsed);.  pWalk
a330: 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72  er->u.i = 0;.  r
a340: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
a350: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
a360: 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a  prIsConst(Expr *
a370: 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29  p, int initFlag)
a380: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
a390: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
a3a0: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 75 2e  zeof(w));.  w.u.
a3b0: 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20  i = initFlag;.  
a3c0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
a3d0: 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  = exprNodeIsCons
a3e0: 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  tant;.  w.xSelec
a3f0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
a400: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
a410: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
a420: 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
a430: 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f  turn w.u.i;.}../
a440: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
a450: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
a460: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
a470: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
a480: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
a490: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
a4a0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
a4b0: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
a4c0: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
a4d0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
a4e0: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
a4f0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
a500: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
a510: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
a520: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
a530: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
a540: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
a550: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
a560: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
a570: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
a580: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a590: 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a 7d  IsConst(p, 1);.}
a5a0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
a5b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
a5c0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
a5d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a5e0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74  constant.** that
a5f0: 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61   does no origina
a600: 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f  te from the ON o
a610: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
a620: 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65  of a join..** Re
a630: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76  turn 0 if it inv
a640: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
a650: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
a660: 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a  s or terms from.
a670: 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e  ** an ON or USIN
a680: 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74  G clause..*/.int
a690: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
a6a0: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78  nstantNotJoin(Ex
a6b0: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
a6c0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
a6d0: 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  3);.}../*.** Wal
a6e0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
a6f0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
a700: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
a710: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
a720: 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63   or a function c
a730: 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e  all with constan
a740: 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65  t arguments.  Re
a750: 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68  turn and 0 if th
a760: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76  ere.** are any v
a770: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
a780: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
a790: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
a7a0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
a7b0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
a7c0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
a7d0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
a7e0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
a7f0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
a800: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
a810: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
a820: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
a830: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a840: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
a850: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
a860: 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 2);.}../*.**
a870: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a880: 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
a890: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
a8a0: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
a8b0: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
a8c0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
a8d0: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
a8e0: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
a8f0: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
a900: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
a910: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a920: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
a930: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
a940: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
a950: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
a960: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
a970: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
a980: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
a990: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a9a0: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
a9b0: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
a9c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
a9d0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70  ..  /* If an exp
a9e0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
a9f0: 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68  teger literal th
aa00: 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67  at fits in a sig
aa10: 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20  ned 32-bit.  ** 
aa20: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
aa30: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
aa40: 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  ag will have alr
aa50: 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f  eady been set */
aa60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  .  assert( p->op
aa70: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
aa80: 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  (p->flags & EP_I
aa90: 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20  ntValue)!=0.    
aaa0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
aab0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a  3GetInt32(p->u.z
aac0: 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29  Token, &rc)==0 )
aad0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ;..  if( p->flag
aae0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
aaf0: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
ab00: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20   p->u.iValue;.  
ab10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
ab20: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
ab30: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  ){.    case TK_U
ab40: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63  PLUS: {.      rc
ab50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73   = sqlite3ExprIs
ab60: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
ab70: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
ab80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ab90: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
aba0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
abb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
abc0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
abd0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
abe0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
abf0: 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37   v!=(-2147483647
ac00: 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  -1) );.        *
ac10: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
ac20: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
ac30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ac40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
ac50: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
ac60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ac70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  /*.** Return FAL
ac80: 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  SE if there is n
ac90: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
aca0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
acb0: 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   be NULL..**.** 
acc0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
acd0: 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  n might be NULL 
ace0: 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73  or if the expres
acf0: 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70  sion is too comp
ad00: 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72  lex.** to tell r
ad10: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a  eturn TRUE.  .**
ad20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ad30: 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f   is used as an o
ad40: 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20  ptimization, to 
ad50: 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f  skip OP_IsNull o
ad60: 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77  pcodes.** when w
ad70: 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61  e know that a va
ad80: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  lue cannot be NU
ad90: 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61  LL.  Hence, a fa
ada0: 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20  lse positive.** 
adb0: 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20  (returning TRUE 
adc0: 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65  when in fact the
add0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
ade0: 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d  never be NULL) m
adf0: 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61  ight.** be a sma
ae00: 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  ll performance h
ae10: 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  it but is otherw
ae20: 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f  ise harmless.  O
ae30: 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68  n the other.** h
ae40: 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67  and, a false neg
ae50: 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67  ative (returning
ae60: 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20   FALSE when the 
ae70: 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20  result could be 
ae80: 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69  NULL).** will li
ae90: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
aea0: 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77  n incorrect answ
aeb0: 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20  er.  So when in 
aec0: 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a  doubt, return.**
aed0: 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71   TRUE..*/.int sq
aee0: 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
aef0: 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ll(const Expr *p
af00: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68  ){.  u8 op;.  wh
af10: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
af20: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
af30: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
af40: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
af50: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
af60: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
af70: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
af80: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
af90: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
afa0: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
afb0: 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65  STRING:.    case
afc0: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
afd0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20  ase TK_BLOB:.   
afe0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
aff0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
b000: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
b010: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
b020: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
b030: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
b040: 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77  constant which w
b050: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61  ould be.** uncha
b060: 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e  nged by OP_Affin
b070: 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66  ity with the aff
b080: 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74  inity given in t
b090: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
b0a0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
b0b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
b0c0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
b0d0: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
b0e0: 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  y operation.** c
b0f0: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20  an be omitted.  
b100: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65  When in doubt re
b110: 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66  turn FALSE.  A f
b120: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a  alse negative.**
b130: 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41   is harmless.  A
b140: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c   false positive,
b150: 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65   however, can re
b160: 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  sult in the wron
b170: 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a  g.** answer..*/.
b180: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e  int sqlite3ExprN
b190: 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
b1a0: 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20  ange(const Expr 
b1b0: 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20  *p, char aff){. 
b1c0: 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66   u8 op;.  if( af
b1d0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f==SQLITE_AFF_NO
b1e0: 4e 45 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  NE ) return 1;. 
b1f0: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
b200: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
b210: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
b220: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
b230: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
b240: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
b250: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
b260: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
b270: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
b280: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
b290: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
b2a0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
b2b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b2c0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
b2d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
b2e0: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
b2f0: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
b300: 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53  F_REAL || aff==S
b310: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
b320: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
b330: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
b340: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
b350: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
b360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b370: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
b380: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b390: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
b3a0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73  LUMN: {.      as
b3b0: 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e  sert( p->iTable>
b3c0: 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e  =0 );  /* p cann
b3d0: 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20  ot be part of a 
b3e0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b3f0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
b400: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20   p->iColumn<0.  
b410: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
b420: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
b430: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
b440: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b  TE_AFF_NUMERIC);
b450: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
b460: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
b470: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
b480: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b490: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
b4a0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
b4b0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
b4c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b4d0: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
b4e0: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
b4f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
b500: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
b510: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
b520: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
b530: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
b540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
b550: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
b560: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
b570: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
b580: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
b590: 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 61  urn true if we a
b5a0: 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49  re able to the I
b5b0: 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d  N operator optim
b5c0: 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20  ization on a.** 
b5d0: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
b5e0: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20  m.**.**       x 
b5f0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
b600: 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20  **.** Where the 
b610: 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65  SELECT... clause
b620: 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65 64   is as specified
b630: 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65   by the paramete
b640: 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75  r to this.** rou
b650: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
b660: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61  Select object pa
b670: 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65  ssed in has alre
b680: 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63  ady been preproc
b690: 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20  essed and no.** 
b6a0: 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e  errors have been
b6b0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64   found..*/.#ifnd
b6c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b6d0: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69  UBQUERY.static i
b6e0: 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  nt isCandidateFo
b6f0: 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70  rInOpt(Select *p
b700: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
b710: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
b720: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
b730: 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d  *pTab;.  if( p==
b740: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  /* right-hand si
b770: 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45  de of IN is SELE
b780: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  CT */.  if( p->p
b790: 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
b7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b7b0: 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  * Not a compound
b7c0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
b7d0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
b7e0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
b7f0: 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
b800: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
b810: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
b820: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
b830: 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
b840: 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ct );.    testca
b850: 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  se( (p->selFlags
b860: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
b870: 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
b880: 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
b890: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
b8a0: 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
b8b0: 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
b8c0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
b8d0: 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
b8e0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
b8f0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
b900: 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
b910: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
b920: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
b930: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b940: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
b950: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
b960: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
b970: 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  fset==0 );      
b980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
b990: 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46  IMIT means no OF
b9a0: 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  FSET */.  if( p-
b9b0: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
b9c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b9d0: 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
b9e0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
b9f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
ba00: 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
ba10: 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
ba20: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
ba30: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
ba40: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
ba50: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
ba60: 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
ba70: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
ba80: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20       /* FROM is 
ba90: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f  not a subquery o
baa0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62  r view */.  pTab
bab0: 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
bac0: 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  ab;.  if( NEVER(
bad0: 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72  pTab==0) ) retur
bae0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
baf0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
bb00: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
bb10: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
bb20: 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
bb30: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
bb40: 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
bb50: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
bb60: 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
bb70: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
bb80: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
bb90: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  t;.  if( pEList-
bba0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
bbb0: 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f  rn 0;       /* O
bbc0: 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ne column in the
bbd0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
bbe0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
bbf0: 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
bc00: 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
bc10: 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20  0; /* Result is 
bc20: 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65  a column */.  re
bc30: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
bc40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bc50: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
bc60: 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e  ** Code an OP_On
bc70: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  ce instruction a
bc80: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  nd allocate spac
bc90: 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20  e for its flag. 
bca0: 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61  Return the .** a
bcb0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
bcc0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
bcd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  /.int sqlite3Cod
bce0: 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61  eOnce(Parse *pPa
bcf0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
bd00: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
bd10: 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f  (pParse);      /
bd20: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
bd30: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
bd40: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bd50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bd60: 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e  P_Once, pParse->
bd70: 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a  nOnce++);.}../*.
bd80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
bd90: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
bda0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
bdb0: 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f  f the IN (...) o
bdc0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20  perator..** The 
bdd0: 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  pX parameter is 
bde0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  the expression o
bdf0: 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  n the RHS of the
be00: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68   IN operator, wh
be10: 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
be20: 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66  either a list of
be30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20   expressions or 
be40: 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  a subquery..**.*
be50: 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  * The job of thi
be60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
be70: 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
be80: 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
be90: 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  hat can.** be us
bea0: 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ed either to tes
beb0: 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
bec0: 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74 20   in the RHS set 
bed0: 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
bee0: 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d  rough.** all mem
bef0: 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53 20  bers of the RHS 
bf00: 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  set, skipping du
bf10: 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
bf20: 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  A cursor is open
bf30: 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65  ed on the b-tree
bf40: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
bf50: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
bf60: 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70  perator.** and p
bf70: 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74  X->iTable is set
bf80: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
bf90: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a   that cursor..**
bfa0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
bfb0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
bfc0: 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65  unction indicate
bfd0: 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70  s the b-tree typ
bfe0: 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  e, as follows:.*
bff0: 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  *.**   IN_INDEX_
c000: 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68 65  ROWID      - The
c010: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
c020: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
c030: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
c040: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
c050: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
c060: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61  s opened on an a
c070: 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a  scending index..
c080: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
c090: 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63  DEX_DESC - The c
c0a0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
c0b0: 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
c0c0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
c0d0: 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20 20  INDEX_EPH       
c0e0: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
c0f0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
c100: 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
c110: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c130: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
c140: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
c150: 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
c160: 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
c170: 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
c180: 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
c190: 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
c1a0: 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
c1b0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
c1c0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
c1d0: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
c1e0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
c1f0: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
c200: 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
c210: 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
c220: 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
c230: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
c240: 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
c250: 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
c260: 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
c270: 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
c280: 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 72  int to the epher
c290: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74  meral table inst
c2a0: 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69  ead of an.** exi
c2b0: 73 74 69 6e 67 20 74 61 62 6c 65 2e 20 20 0a 2a  sting table.  .*
c2c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
c2d0: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
c2e0: 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20   is 0, then the 
c2f0: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
c300: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
c310: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
c320: 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  t members, skipp
c330: 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ing any duplicat
c340: 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  es. In this case
c350: 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c   an.** epheremal
c360: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
c370: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
c380: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
c390: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
c3a0: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
c3b0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
c3c0: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
c3d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
c3e0: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
c3f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
c400: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
c410: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
c420: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
c430: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
c440: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
c450: 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
c460: 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73  fast set members
c470: 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68  hip tests. In th
c480: 69 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72  is case an epher
c490: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
c4a0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
c4b0: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
c4c0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
c4d0: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
c4e0: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
c4f0: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
c500: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
c510: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
c520: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
c530: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
c540: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
c550: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
c560: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 65 65 64  function.** need
c570: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65  s to know whethe
c580: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72  r or not the str
c590: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
c5a0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20  an SQL NULL .** 
c5b0: 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74  value in order t
c5c0: 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c  o correctly eval
c5d0: 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  uate expressions
c5e0: 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20   like "X IN (Y, 
c5f0: 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65  Z)"..** If there
c600: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
c610: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
c620: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
c630: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
c640: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
c650: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
c660: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
c670: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
c680: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f  tten.** to *prNo
c690: 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65  tFound. If there
c6a0: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
c6b0: 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f 6e  at the (...) con
c6c0: 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20  tains a.** NULL 
c6d0: 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e  value, then *prN
c6e0: 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20  otFound is left 
c6f0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
c700: 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
c710: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
c720: 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f  its location sto
c730: 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75  red in *prNotFou
c740: 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20  nd, then.** its 
c750: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73  initial value is
c760: 20 4e 55 4c 4c 2e 20 20 49 66 20 74 68 65 20 28   NULL.  If the (
c770: 2e 2e 2e 29 20 64 6f 65 73 20 6e 6f 74 20 72 65  ...) does not re
c780: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
c790: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
c7a0: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
c7b0: 69 2e 65 2e 20 74 68 65 20 53 45 4c 45 43 54 20  i.e. the SELECT 
c7c0: 77 69 74 68 69 6e 20 74 68 65 20 28 2e 2e 2e 29  within the (...)
c7d0: 0a 2a 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61  .** is a correla
c7e0: 74 65 64 20 73 75 62 71 75 65 72 79 29 20 74 68  ted subquery) th
c7f0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
c800: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65  the allocated re
c810: 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73  gister is.** res
c820: 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20  et to NULL each 
c830: 74 69 6d 65 20 74 68 65 20 73 75 62 71 75 65 72  time the subquer
c840: 79 20 69 73 20 72 65 72 75 6e 2e 20 54 68 69 73  y is rerun. This
c850: 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 63   allows the.** c
c860: 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62  aller to use vdb
c870: 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  e code equivalen
c880: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
c890: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
c8a0: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
c8b0: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
c8c0: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
c8d0: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
c8e0: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
c8f0: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
c900: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
c910: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
c920: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
c930: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
c940: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
c950: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
c960: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
c970: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
c980: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c990: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
c9a0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
c9b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
c9c0: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
c9d0: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
c9e0: 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  t *p;           
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68   /* SELECT to th
ca10: 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70  e right of IN op
ca20: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
ca30: 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20  eType = 0;      
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53    /* Type of RHS
ca60: 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58   table. IN_INDEX
ca70: 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  _* */.  int iTab
ca80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
ca90: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +;            /*
caa0: 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52   Cursor of the R
cab0: 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  HS table */.  in
cac0: 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d  t mustBeUnique =
cad0: 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 29   (prNotFound==0)
cae0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52  ;   /* True if R
caf0: 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75  HS must be uniqu
cb00: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
cb10: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
cb20: 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
cb30: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
cb40: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a  being coded */..
cb50: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
cb60: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 0a 20 20 2f 2a  ==TK_IN );..  /*
cb70: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
cb80: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
cb90: 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  le or index can 
cba0: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
cbb0: 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72  satisfy the quer
cbc0: 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66  y.  This is pref
cbd0: 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61  erable to genera
cbe0: 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a  ting a new .  **
cbf0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
cc00: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78  ..  */.  p = (Ex
cc10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
cc20: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
cc30: 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ? pX->x.pSelect 
cc40: 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  : 0);.  if( ALWA
cc50: 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  YS(pParse->nErr=
cc60: 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64 61  =0) && isCandida
cc70: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b  teForInOpt(p) ){
cc80: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
cc90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ccb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ccc0: 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
ccd0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
cd00: 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  >. */.    Expr *
cd10: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c   /* Expression <
cd40: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
cd50: 31 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  16 iCol;        
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
cd80: 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e  f column <column
cd90: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  > */.    i16 iDb
cda0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
cdd0: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20  for pTab */..   
cde0: 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20 20   assert( p );   
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
ce10: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
ce20: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
ce30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ce40: 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
ce50: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
ce60: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
ce70: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
ce80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ce90: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
cea0: 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
ceb0: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
cec0: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
ced0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
cee0: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
cef0: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
cf00: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
cf10: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
cf20: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
cf30: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[0].pTab;.    
cf40: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
cf50: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
cf60: 20 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29 70     iCol = (i16)p
cf70: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
cf80: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61    .    /* Code a
cf90: 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  n OP_Transaction
cfa0: 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63   and OP_TableLoc
cfb0: 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a  k for <table>. *
cfc0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
cfd0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
cfe0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
cff0: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
d000: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
d010: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
d020: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
d030: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
d040: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
d050: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
d060: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
d070: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
d080: 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63  ed from two plac
d090: 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65  es. In both case
d0a0: 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a  s the vdbe.    *
d0b0: 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
d0c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f  en allocated. So
d0d0: 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47   assume sqlite3G
d0e0: 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61  etVdbe() is alwa
d0f0: 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  ys.    ** succes
d100: 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a  sful here..    *
d110: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b  /.    assert(v);
d120: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
d130: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  ){.      int iAd
d140: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
d150: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
d160: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d170: 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
d180: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
d190: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
d1a0: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
d1b0: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
d1c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
d1d0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
d1e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d1f0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
d200: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
d210: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d230: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
d240: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
d250: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
d260: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
d270: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
d280: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
d290: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
d2a0: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
d2b0: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
d2c0: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
d2d0: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
d2e0: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
d2f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a  ion sequence.  *
d300: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
d310: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
d320: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
d330: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
d340: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
d350: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
d360: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
d370: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
d380: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
d390: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
d3a0: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
d3b0: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
d3c0: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
d3d0: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
d3e0: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
d3f0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
d400: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
d410: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
d420: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
d430: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
d440: 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e  ityOk(pX, pTab->
d450: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
d460: 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ity);..      for
d470: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d480: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
d490: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
d4a0: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
d4b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d4c0: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
d4d0: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
d4e0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
d4f0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
d500: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
d510: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
d520: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
d530: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
d540: 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  | (pIdx->nKeyCol
d550: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
d560: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a  rror!=OE_None)).
d570: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
d580: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
d590: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
d5a0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
d5b0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
d5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d5d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
d5e0: 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
d5f0: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
d600: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d610: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
d620: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
d630: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d640: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d650: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
d660: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
d670: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d680: 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
d690: 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
d6a0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
d6b0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
d6c0: 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
d6d0: 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20  rtOrder[0];..   
d6e0: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
d6f0: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
d700: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
d710: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
d720: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
d730: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
d740: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d750: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d760: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
d770: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20  NotFound);.     
d780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d790: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d7a0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
d7b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d7c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
d7d0: 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
d7e0: 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
d7f0: 66 6f 75 6e 64 20 61 6e 20 65 78 69 73 74 69 6e  found an existin
d800: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
d810: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
d820: 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
d830: 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
d840: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
d850: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
d860: 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
d870: 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
d880: 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
d890: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
d8a0: 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
d8b0: 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
d8c0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
d8d0: 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70 72  _EPH;.    if( pr
d8e0: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
d8f0: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
d900: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b  rMayHaveNull = +
d910: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
d920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
d940: 6c 2c 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e  l, 0, *prNotFoun
d950: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
d960: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
d970: 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
d980: 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
d990: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
d9a0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d9b0: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
d9c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
d9d0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
d9e0: 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
d9f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
da00: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
da10: 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
da20: 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
da30: 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
da40: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
da50: 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
da60: 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
da70: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
da80: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
da90: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
daa0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
dab0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
dac0: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
dad0: 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
dae0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
daf0: 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
db00: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
db10: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
db20: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
db30: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
db40: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
db50: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
db60: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
db70: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
db80: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
dba0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
dbb0: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
dbc0: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
dbd0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
dbe0: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
dbf0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
dc00: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
dc10: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
dc20: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
dc30: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
dc40: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
dc50: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
dc60: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
dc70: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
dc80: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
dc90: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
dca0: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
dcb0: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
dcc0: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
dcd0: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
dce0: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
dcf0: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
dd00: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
dd10: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
dd20: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
dd30: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
dd40: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
dd50: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
dd60: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
dd70: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
dd80: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
dd90: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
dda0: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
ddb0: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
ddc0: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
ddd0: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
dde0: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
ddf0: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
de00: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
de10: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
de20: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
de30: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
de40: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
de50: 2e 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  ..** Furthermore
de60: 2c 20 74 68 65 20 49 4e 20 69 73 20 69 6e 20 61  , the IN is in a
de70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
de80: 64 20 74 68 61 74 20 77 65 20 72 65 61 6c 6c 79  d that we really
de90: 20 77 61 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72   want.** to iter
dea0: 61 74 65 20 6f 76 65 72 20 74 68 65 20 52 48 53  ate over the RHS
deb0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
dec0: 74 6f 72 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tor in order to 
ded0: 71 75 69 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a  quickly locate.*
dee0: 2a 20 61 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64  * all correspond
def0: 69 6e 67 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73  ing LHS elements
df00: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
df10: 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
df20: 69 61 6c 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65  ialize.** the re
df30: 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
df40: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20  rMayHaveNull to 
df50: 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
df60: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
df70: 65 0a 2a 2a 20 63 61 72 65 20 6f 66 20 63 68 61  e.** care of cha
df80: 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
df90: 74 65 72 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  ter value to non
dfa0: 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
dfb0: 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
dfc0: 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
dfd0: 4e 75 6c 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68  Null is zero, th
dfe0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
dff0: 65 20 73 75 62 71 75 65 72 79 20 69 73 20 62 65  e subquery is be
e000: 69 6e 67 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20  ing used.** for 
e010: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 69  membership testi
e020: 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20  ng only.  There 
e030: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e  is no need to in
e040: 69 74 69 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20  itialize any.** 
e050: 72 65 67 69 73 74 65 72 73 20 74 6f 20 69 6e 64  registers to ind
e060: 69 63 61 74 65 20 74 68 65 20 70 72 65 73 65 6e  icate the presen
e070: 63 65 20 6f 72 20 61 62 73 65 6e 63 65 20 6f 66  ce or absence of
e080: 20 4e 55 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48   NULLs on the RH
e090: 53 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53  S..**.** For a S
e0a0: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20  ELECT or EXISTS 
e0b0: 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e  operator, return
e0c0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68   the register th
e0d0: 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  at holds the.** 
e0e0: 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20  result.  For IN 
e0f0: 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20  operators or if 
e100: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
e110: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
e120: 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64  e is 0..*/.#ifnd
e130: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e140: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
e150: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
e160: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e170: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e180: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e190: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e1b0: 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f  he IN, SELECT, o
e1c0: 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
e1d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 4d 61 79 48  r */.  int rMayH
e1e0: 61 76 65 4e 75 6c 6c 2c 20 20 20 20 20 20 20 2f  aveNull,       /
e1f0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
e200: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
e210: 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52  NULLs exist in R
e220: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  HS */.  int isRo
e230: 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
e240: 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20  /* If true, LHS 
e250: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  of IN operator i
e260: 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  s a rowid */.){.
e270: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
e280: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
e290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
e2a0: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
e2b0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
e2c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
e2f0: 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
e300: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
e310: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e320: 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
e330: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
e340: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
e350: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
e360: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
e370: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
e380: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
e390: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
e3a0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
e3b0: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
e3c0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
e3d0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
e3e0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
e3f0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
e400: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
e410: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
e420: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
e430: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
e440: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
e450: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
e460: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
e470: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
e480: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
e490: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
e4a0: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
e4b0: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
e4c0: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
e4d0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
e4e0: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
e4f0: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
e500: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
e510: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
e520: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
e530: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
e540: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 74 65 73  lect) ){.    tes
e550: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  tAddr = sqlite3C
e560: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e570: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e580: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
e590: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
e5a0: 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
e5b0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
e5c0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
e5d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
e5e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
e5f0: 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
e600: 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
e610: 74 65 73 74 41 64 64 72 3e 3d 30 3f 22 22 3a 22  testAddr>=0?"":"
e620: 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
e630: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
e640: 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
e650: 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e  CALAR", pParse->
e660: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
e670: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
e680: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
e690: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
e6a0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
e6b0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
e6c0: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
e6d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
e6e0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
e6f0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
e700: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e720: 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
e730: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
e740: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
e770: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e780: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
e790: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
e7a0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
e7b0: 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
e7c0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
e7d0: 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
e7e0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
e7f0: 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
e800: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  ormation */..   
e810: 20 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e     if( rMayHaveN
e820: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
e830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e840: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
e850: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20  rMayHaveNull);. 
e860: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66       }..      af
e870: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e880: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
e890: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
e8a0: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
e8b0: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
e8c0: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
e8d0: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
e8e0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
e8f0: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
e900: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
e910: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
e920: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
e930: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
e940: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
e950: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
e960: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
e970: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
e980: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
e990: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
e9a0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
e9b0: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
e9c0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
e9d0: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
e9e0: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
e9f0: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
ea00: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
ea10: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
ea20: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
ea30: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
ea40: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
ea50: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
ea60: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
ea70: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
ea80: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
ea90: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
eaa0: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
eab0: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
eac0: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
ead0: 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
eae0: 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
eaf0: 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
eb00: 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
eb10: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
eb20: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
eb30: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
eb40: 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
eb50: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
eb60: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
eb70: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
eb80: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
eb90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
eba0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
ebb0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
ebc0: 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f  r->iTable, !isRo
ebd0: 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  wid);.      pKey
ebe0: 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f  Info = isRowid ?
ebf0: 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49   0 : sqlite3KeyI
ec00: 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
ec10: 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20  >db, 1, 1);..   
ec20: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
ec30: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
ec40: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
ec50: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
ec60: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
ec70: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
ec80: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
ec90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
eca0: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
ecb0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
ecc0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
ecd0: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
ece0: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
ecf0: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
ed00: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
ed10: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
ed20: 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78  dest;.        Ex
ed30: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
ed40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ed50: 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
ed70: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
ed80: 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
ed90: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
eda0: 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74 20     dest.affSdst 
edb0: 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a  = (u8)affinity;.
edc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
edd0: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
ede0: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
edf0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
ee00: 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53       pExpr->x.pS
ee10: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
ee20: 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  0;.        testc
ee30: 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30  ase( pKeyInfo==0
ee40: 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79   ); /* Caused by
ee50: 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b   OOM in sqlite3K
ee60: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f  eyInfoAlloc() */
ee70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ee80: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ee90: 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  e, pExpr->x.pSel
eea0: 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  ect, &dest) ){. 
eeb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eec0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
eed0: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  yInfo);.        
eee0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
eef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
ef00: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
ef10: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
ef20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ef30: 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
ef40: 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
ef50: 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
ef60: 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
ef70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ef80: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
ef90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
efa0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
efb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
efc0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
efd0: 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
efe0: 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  fo) );.        p
eff0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
f000: 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
f010: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
f020: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f030: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f070: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
f080: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
f090: 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
f0a0: 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
f0b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
f0c0: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
f0d0: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
f0e0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
f0f0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
f100: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
f110: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
f120: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
f130: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
f140: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
f150: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
f160: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
f170: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
f180: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
f190: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
f1a0: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
f1b0: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
f1c0: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
f1d0: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
f1e0: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
f1f0: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
f200: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
f210: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
f220: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
f230: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
f240: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f250: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
f260: 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
f270: 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r3;..        if
f280: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
f290: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
f2a0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
f2b0: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
f2c0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
f2d0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
f2e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f2f0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
f300: 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
f310: 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
f320: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
f330: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
f340: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
f350: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
f360: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
f370: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
f380: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
f390: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
f3a0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
f3b0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f3c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
f3d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f3e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f400: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
f410: 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
f420: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
f430: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
f440: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
f450: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
f460: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
f470: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
f480: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56            int iV
f490: 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
f4a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
f4b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
f4c0: 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
f4d0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
f4e0: 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
f4f0: 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
f500: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
f510: 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
f520: 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
f530: 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
f540: 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
f550: 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
f560: 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
f570: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
f580: 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
f590: 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
f5a0: 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
f5b0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
f5c0: 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 3d 30   if( testAddr>=0
f5d0: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
f5e0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
f5f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
f600: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f610: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
f620: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dr);.           
f630: 20 74 65 73 74 41 64 64 72 20 3d 20 2d 31 3b 0a   testAddr = -1;.
f640: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
f650: 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
f660: 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
f670: 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
f680: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
f690: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
f6a0: 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
f6b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
f6c0: 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
f6d0: 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
f6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f6f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
f700: 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
f710: 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
f720: 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
f730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f740: 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
f750: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
f760: 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
f770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
f780: 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
f790: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f7a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f7b0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
f7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f7f0: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
f810: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f830: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f840: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
f850: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
f860: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
f870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f890: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
f8a0: 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
f8b0: 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
f8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f8d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f8e0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
f8f0: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f920: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
f930: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f940: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
f950: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
f960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f970: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f980: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f990: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
f9a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f9b0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f9d0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
f9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9f0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
fa00: 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
fa10: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
fa20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fa30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
fa40: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
fa50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
fa60: 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
fa70: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
fa80: 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
fa90: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
faa0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
fab0: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
fac0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
fad0: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
fae0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
faf0: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
fb00: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
fb10: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
fb20: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
fb30: 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
fb40: 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
fb50: 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
fb60: 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
fb70: 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
fb80: 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
fb90: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
fba0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
fbb0: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
fbc0: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
fbd0: 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbf0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fc00: 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
fc10: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
fc20: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
fc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
fc40: 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
fc50: 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
fc60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fc70: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
fc80: 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
fc90: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
fca0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
fcb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fcc0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
fcd0: 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
fce0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
fcf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
fd00: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
fd10: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
fd20: 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
fd30: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
fd40: 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
fd50: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
fd60: 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
fd70: 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
fd80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
fd90: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
fda0: 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
fdb0: 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
fdc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fdd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
fde0: 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
fdf0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
fe00: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
fe10: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
fe20: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
fe30: 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
fe40: 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
fe50: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
fe60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fe70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
fe80: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
fe90: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
fea0: 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
feb0: 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
fec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
fed0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
fee0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
fef0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
ff00: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
ff10: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
ff20: 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
ff30: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
ff60: 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20  IntTokens[1]);. 
ff70: 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69       pSel->iLimi
ff80: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
ff90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ffa0: 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
ffb0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
ffc0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
ffd0: 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
ffe0: 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
fff0: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
10000 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
10010 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
10020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
10030 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72  ..  if( testAddr
10040 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
10050 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10060 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d  , testAddr);.  }
10070 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10080 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
10090 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
100a0 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
100b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
100c0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
100d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
100e0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
100f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
10100 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
10110 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
10120 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
10130 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
10140 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
10150 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
10160 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
10170 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
10180 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
10190 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
101a0 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
101b0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
101c0 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
101d0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
101e0 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
101f0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
10200 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
10210 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
10220 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
10230 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
10240 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
10250 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
10260 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
10270 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
10280 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
10290 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
102a0 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
102b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
102c0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 77  generates code w
102d0 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  ill jump to dest
102e0 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
102f0 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
10300 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
10310 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
10320 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
10330 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
10340 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
10350 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
10360 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
10370 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
10380 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
10390 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
103a0 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
103b0 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61   through..*/.sta
103c0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
103d0 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
103e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
103f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
10400 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
10410 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10420 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
10430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
10440 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
10450 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
10460 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
10470 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
10480 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
10490 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
104a0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
104b0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
104c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
104d0 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
104e0 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
104f0 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
10500 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
10510 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
10520 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
10530 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68  L values */.  ch
10540 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
10550 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
10560 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  n affinity to us
10570 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  e */.  int eType
10580 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10590 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20  Type of the RHS 
105a0 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20  */.  int r1;    
105b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
105c0 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
105d0 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ster */.  Vdbe *
105e0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
105f0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
10600 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
10610 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
10620 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65   the RHS.   Afte
10630 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
10640 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
10650 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69  or.  ** pExpr->i
10660 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61  Table will conta
10670 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
10680 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
10690 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  RHS..  */.  v = 
106a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
106b0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
106c0 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65         /* OOM de
106d0 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20  tected prior to 
106e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
106f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
10700 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
10710 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65  expr"));.  eType
10720 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
10730 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
10740 78 70 72 2c 20 26 72 52 68 73 48 61 73 4e 75 6c  xpr, &rRhsHasNul
10750 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  l);..  /* Figure
10760 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
10770 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
10780 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
10790 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f  e results.  ** o
107a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
107b0 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
107c0 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
107d0 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
107e0 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f  r.  ** P4 of OP_
107f0 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f  MakeRecord..  */
10800 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f  .  affinity = co
10810 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
10820 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43  (pExpr);..  /* C
10830 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
10840 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
10850 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a  xpr> IN (...)"..
10860 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
10870 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
10880 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  se);.  r1 = sqli
10890 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
108a0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
108b0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
108c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72   pExpr->pLeft, r
108d0 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  1);..  /* If the
108e0 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68   LHS is NULL, th
108f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
10900 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72   either false or
10910 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a   NULL depending.
10920 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20    ** on whether 
10930 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79  the RHS is empty
10940 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74   or not, respect
10950 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ively..  */.  if
10960 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
10970 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
10980 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
10990 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
109a0 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65   where the false
109b0 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d   and NULL outcom
109c0 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  es are.    ** th
109d0 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73  e same. */.    s
109e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
109f0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
10a00 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  1, destIfNull); 
10a10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10a30 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
10a40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10a50 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20  P_NotNull, r1); 
10a60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10a80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
10a90 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
10aa0 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
10ab0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
10ac0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
10ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10ae0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
10af0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  IfNull);.    sql
10b00 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10b10 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a  (v, addr1);.  }.
10b20 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
10b30 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
10b40 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
10b50 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
10b60 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62  the ROWID of tab
10b70 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 2a 2f  le b-tree.    */
10b80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10b90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
10ba0 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74  tBeInt, r1, dest
10bb0 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f  IfFalse); VdbeCo
10bc0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
10bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10be0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
10bf0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10c00 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10c10 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
10c20 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
10c30 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
10c40 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
10c50 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
10c60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
10c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10c80 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
10c90 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  1, 1, 0, &affini
10ca0 74 79 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ty, 1);..    /* 
10cb0 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  If the set membe
10cc0 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73  rship test fails
10cd0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10ce0 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  t of the .    **
10cf0 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
10d00 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
10d10 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
10d20 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
10d30 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
10d40 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
10d50 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
10d60 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
10d70 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
10d80 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
10d90 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
10da0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
10db0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
10dc0 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a  n is also NULL..
10dd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
10de0 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 7c 7c  RhsHasNull==0 ||
10df0 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
10e00 73 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  stIfNull ){.    
10e10 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
10e20 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
10e30 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
10e40 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48  time that the RH
10e50 53 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f  S.      ** canno
10e60 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76  t contain NULL v
10e70 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
10e80 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
10e90 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20  t.      ** of a 
10ea0 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
10eb0 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
10ec0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
10ed0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10ee0 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
10ef0 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
10f00 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
10f10 4c 53 45 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  LSE.      ** for
10f20 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
10f30 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   IN operator..  
10f40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
10f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10f60 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
10f70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10f80 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
10f90 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
10fa0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10fc0 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c   In this branch,
10fd0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
10fe0 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  IN might contain
10ff0 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20   a NULL and.    
11000 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
11010 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
11020 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
11030 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
11040 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d  .      ** outcom
11050 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
11060 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 0a 20    int j1, j2;.. 
11070 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68       /* First ch
11080 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
11090 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
110a0 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ed in the RHS.  
110b0 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20  If so,.      ** 
110c0 74 68 65 6e 20 74 68 65 20 70 72 65 73 65 6e 63  then the presenc
110d0 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68  e of NULLs in th
110e0 65 20 52 48 53 20 64 6f 65 73 20 6e 6f 74 20 6d  e RHS does not m
110f0 61 74 74 65 72 2c 20 73 6f 20 6a 75 6d 70 0a 20  atter, so jump. 
11100 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 61 6c 6c       ** over all
11110 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61   of the code tha
11120 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 20  t follows..     
11130 20 2a 2f 0a 20 20 20 20 20 20 6a 31 20 3d 20 73   */.      j1 = s
11140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11150 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
11160 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11170 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  0, r1, 1);.     
11180 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11190 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 48 65 72 65  ;..      /* Here
111a0 20 77 65 20 62 65 67 69 6e 20 67 65 6e 65 72 61   we begin genera
111b0 74 69 6e 67 20 63 6f 64 65 20 74 68 61 74 20 72  ting code that r
111c0 75 6e 73 20 69 66 20 74 68 65 20 4c 48 53 20 69  uns if the LHS i
111d0 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  s not.      ** c
111e0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
111f0 74 68 65 20 52 48 53 2e 20 20 47 65 6e 65 72 61  the RHS.  Genera
11200 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  te additional co
11210 64 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  de that.      **
11220 20 74 65 73 74 73 20 74 68 65 20 52 48 53 20 66   tests the RHS f
11230 6f 72 20 4e 55 4c 4c 73 2e 20 20 49 66 20 74 68  or NULLs.  If th
11240 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 61  e RHS contains a
11250 20 4e 55 4c 4c 20 74 68 65 6e 0a 20 20 20 20 20   NULL then.     
11260 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 64 65 73 74   ** jump to dest
11270 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 72  IfNull.  If ther
11280 65 20 61 72 65 20 6e 6f 20 4e 55 4c 4c 73 20 69  e are no NULLs i
11290 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 0a 20  n the RHS then. 
112a0 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
112b0 64 65 73 74 49 66 46 61 6c 73 65 2e 0a 20 20 20  destIfFalse..   
112c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
112d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
112e0 20 4f 50 5f 49 66 2c 20 72 52 68 73 48 61 73 4e   OP_If, rRhsHasN
112f0 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
11300 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11310 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11330 5f 49 66 4e 6f 74 2c 20 72 52 68 73 48 61 73 4e  _IfNot, rRhsHasN
11340 75 6c 6c 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ull, destIfFalse
11350 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11360 76 29 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73  v);.      j2 = s
11370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11380 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
11390 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
113a0 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  0, rRhsHasNull, 
113b0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
113c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
113d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
113f0 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  , 0, rRhsHasNull
11400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11420 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
11430 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
11440 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11450 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20  e(v, j2);.      
11460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11470 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11480 20 31 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 29   1, rRhsHasNull)
11490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
114a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
114b0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e  Goto, 0, destIfN
114c0 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ull);..      /* 
114d0 54 68 65 20 4f 50 5f 46 6f 75 6e 64 20 61 74 20  The OP_Found at 
114e0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
114f0 62 72 61 6e 63 68 20 6a 75 6d 70 73 20 68 65 72  branch jumps her
11500 65 20 77 68 65 6e 20 74 72 75 65 2c 20 0a 20 20  e when true, .  
11510 20 20 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 74      ** causing t
11520 68 65 20 6f 76 65 72 61 6c 6c 20 49 4e 20 65 78  he overall IN ex
11530 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
11540 69 6f 6e 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f  ion to fall thro
11550 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
11560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11570 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
11580 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
11590 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
115a0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
115b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
115c0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
115d0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
115e0 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
115f0 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
11600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11610 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
11620 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
11630 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
11640 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
11650 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
11660 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
11670 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
11680 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
11690 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
116a0 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
116b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
116c0 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
116d0 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69  eturn out;.}..#i
116e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
116f0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
11700 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
11710 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
11720 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
11730 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
11740 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
11750 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
11760 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
11770 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
11780 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
11790 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
117a0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
117b0 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
117c0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
117d0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
117e0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
117f0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
11800 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
11810 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
11820 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
11830 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
11840 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
11850 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
11860 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
11870 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
11880 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
11890 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20  value;.    char 
118a0 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *zV;.    sqlite3
118b0 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20  AtoF(z, &value, 
118c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
118d0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
118e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73  ;.    assert( !s
118f0 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
11900 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77  e) ); /* The new
11910 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75   AtoF never retu
11920 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69  rns NaN */.    i
11930 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
11940 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
11950 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11960 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11970 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
11980 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11990 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
119a0 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
119b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
119c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
119d0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
119e0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
119f0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
11a00 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
11a10 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
11a20 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
11a30 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
11a40 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
11a50 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
11a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
11a70 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
11a80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
11a90 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
11aa0 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
11ab0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
11ac0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
11ad0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
11ae0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
11af0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
11b00 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
11b10 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
11b20 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
11b30 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
11b40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b50 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11b60 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
11b70 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
11b80 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
11b90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
11ba0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
11bb0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
11bc0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
11bd0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
11be0 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
11bf0 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
11c00 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69 66  TE_UTF8);.    if
11c10 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
11c20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
11c30 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
11c40 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
11c50 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
11c60 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
11c70 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
11c80 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
11c90 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
11ca0 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
11cb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11cc0 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
11cd0 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
11ce0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
11cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
11d00 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
11d10 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
11d20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11d30 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
11d40 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
11d50 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
11d60 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
11d70 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
11d80 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 23  egFlag, iMem);.#
11d90 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
11da0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
11db0 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
11dc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
11dd0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
11de0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
11df0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
11e00 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
11e10 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
11e20 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
11e30 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
11e40 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
11e50 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
11e60 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
11e70 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
11e80 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
11e90 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
11ea0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
11eb0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
11ec0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
11ed0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
11ee0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
11ef0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
11f00 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
11f10 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
11f20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11f30 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
11f40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11f50 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
11f60 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
11f70 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
11f80 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
11f90 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
11fa0 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  he *p;..  assert
11fb0 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20  ( iReg>0 );  /* 
11fc0 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  Register numbers
11fd0 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
11fe0 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  tive */.  assert
11ff0 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43  ( iCol>=-1 && iC
12000 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20  ol<32768 );  /* 
12010 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75  Finite column nu
12020 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  mbers */..  /* T
12030 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  he SQLITE_Column
12040 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62  Cache flag disab
12050 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  les the column c
12060 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75  ache.  This is u
12070 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73  sed.  ** for tes
12080 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76  ting only - to v
12090 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74  erify that SQLit
120a0 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68  e always gets th
120b0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
120c0 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68  ** with and with
120d0 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  out the column c
120e0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
120f0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
12100 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
12110 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  , SQLITE_ColumnC
12120 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  ache) ) return;.
12130 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c  .  /* First repl
12140 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ace any existing
12150 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
12160 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
12170 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  way the column c
12180 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c  ache is currentl
12190 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67  y used, we are g
121a0 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74  uaranteed.  ** t
121b0 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77  hat the object w
121c0 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64  ill never alread
121d0 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20  y be in cache.  
121e0 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72  Verify this guar
121f0 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e  antee..  */.#ifn
12200 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72  def NDEBUG.  for
12210 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
12220 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
12230 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
12240 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61  i++, p++){.    a
12250 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d  ssert( p->iReg==
12260 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d  0 || p->iTable!=
12270 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75  iTab || p->iColu
12280 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a  mn!=iCol );.  }.
12290 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e  #endif..  /* Fin
122a0 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20  d an empty slot 
122b0 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a  and replace it *
122c0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  /.  for(i=0, p=p
122d0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
122e0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
122f0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
12300 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
12310 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==0 ){.      p-
12320 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
12330 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
12340 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d       p->iTable =
12350 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e   iTab;.      p->
12360 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
12370 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
12380 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74  iReg;.      p->t
12390 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
123a0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
123b0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
123c0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
123d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
123e0 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72  place the last r
123f0 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a  ecently used */.
12400 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66    minLru = 0x7ff
12410 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20  fffff;.  idxLru 
12420 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  = -1;.  for(i=0,
12430 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
12440 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
12450 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
12460 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
12470 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20  >lru<minLru ){. 
12480 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b       idxLru = i;
12490 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20  .      minLru = 
124a0 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20  p->lru;.    }.  
124b0 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69  }.  if( ALWAYS(i
124c0 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20  dxLru>=0) ){.   
124d0 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
124e0 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b  olCache[idxLru];
124f0 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d  .    p->iLevel =
12500 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
12510 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61  evel;.    p->iTa
12520 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
12530 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
12540 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  l;.    p->iReg =
12550 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65   iReg;.    p->te
12560 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70  mpReg = 0;.    p
12570 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
12580 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
12590 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a   return;.  }.}..
125a0 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
125b0 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65  hat registers be
125c0 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67  tween iReg..iReg
125d0 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e  +nReg-1 are bein
125e0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a  g overwritten..*
125f0 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67  * Purge the rang
12600 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66  e of registers f
12610 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
12620 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
12630 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
12640 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
12650 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
12660 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
12670 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20  ;.  int iLast = 
12680 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b  iReg + nReg - 1;
12690 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
126a0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
126b0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
126c0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
126d0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
126e0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  , p++){.    int 
126f0 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  r = p->iReg;.   
12700 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20   if( r>=iReg && 
12710 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  r<=iLast ){.    
12720 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
12730 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
12740 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
12750 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12760 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
12770 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20   current column 
12780 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20  cache context.  
12790 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20  Any new entries 
127a0 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74  added.** added t
127b0 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  o the column cac
127c0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61  he after this ca
127d0 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77  ll are removed w
127e0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  hen the.** corre
127f0 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63  sponding pop occ
12800 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
12810 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
12820 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  h(Parse *pParse)
12830 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  {.  pParse->iCac
12840 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65  heLevel++;.#ifde
12850 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
12860 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
12870 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
12880 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
12890 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55  {.    printf("PU
128a0 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  SH to %d\n", pPa
128b0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
128c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
128d0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72  ./*.** Remove fr
128e0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
128f0 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  che any entries 
12900 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20  that were added 
12910 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65  since the.** the
12920 20 70 72 65 76 69 6f 75 73 20 4e 20 50 75 73 68   previous N Push
12930 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 6e   operations.  In
12940 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
12950 73 74 6f 72 65 20 74 68 65 20 63 61 63 68 65 0a  store the cache.
12960 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  ** to the state 
12970 69 74 20 77 61 73 20 69 6e 20 4e 20 50 75 73 68  it was in N Push
12980 65 73 20 61 67 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  es ago..*/.void 
12990 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
129a0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
129b0 65 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  e, int N){.  int
129c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
129d0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
129e0 65 72 74 28 20 4e 3e 30 20 29 3b 0a 20 20 61 73  ert( N>0 );.  as
129f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
12a00 61 63 68 65 4c 65 76 65 6c 3e 3d 4e 20 29 3b 0a  acheLevel>=N );.
12a10 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
12a20 4c 65 76 65 6c 20 2d 3d 20 4e 3b 0a 23 69 66 64  Level -= N;.#ifd
12a30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
12a40 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
12a50 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
12a60 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
12a70 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
12a80 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  OP  to %d\n", pP
12a90 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12aa0 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  l);.  }.#endif. 
12ab0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
12ac0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
12ad0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
12ae0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
12af0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26     if( p->iReg &
12b00 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  & p->iLevel>pPar
12b10 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
12b20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
12b30 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
12b40 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
12b50 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
12b60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
12b70 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
12b80 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
12b90 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
12ba0 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
12bb0 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
12bc0 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
12bd0 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
12be0 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
12bf0 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
12c00 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
12c10 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
12c20 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
12c30 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
12c40 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
12c50 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
12c60 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
12c70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12c80 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
12c90 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
12ca0 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
12cb0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12cc0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12cd0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12ce0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
12cf0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
12d00 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
12d10 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
12d20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
12d30 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
12d40 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
12d50 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
12d60 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
12d70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
12d80 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
12d90 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
12da0 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
12db0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
12dc0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
12dd0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
12de0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
12df0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
12e00 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
12e10 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
12e20 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
12e30 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
12e40 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
12e50 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
12e60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12e70 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
12e80 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
12e90 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
12ea0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
12eb0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
12ec0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
12ed0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
12ee0 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
12ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f00 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
12f10 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
12f20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12f30 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
12f40 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
12f50 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
12f60 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
12f70 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
12f80 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
12f90 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
12fa0 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
12fb0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
12fc0 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
12fd0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
12fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12ff0 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
13000 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
13010 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
13020 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
13030 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
13040 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
13050 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
13060 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
13070 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
13080 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
13090 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
130a0 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
130b0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
130c0 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
130d0 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20  .  An effort.** 
130e0 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65  is made to store
130f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
13100 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
13110 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a  eg, but this is.
13120 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65  ** not guarantee
13130 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  d.  The location
13140 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
13150 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
13160 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
13170 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
13180 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
13190 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
131a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
131b0 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
131c0 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
131d0 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
131e0 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
131f0 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wid..*/.int sqli
13200 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
13210 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
13220 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
13230 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
13240 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
13250 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
13260 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
13270 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
13280 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
13290 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
132a0 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
132b0 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
132c0 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
132d0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
132e0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
132f0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
13300 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
13310 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
13320 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
13330 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
13340 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
13350 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a   for OP_Column *
13360 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
13370 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13380 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
13390 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
133a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
133b0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
133c0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
133d0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
133e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
133f0 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d  >0 && p->iTable=
13400 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43  =iTable && p->iC
13410 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29  olumn==iColumn )
13420 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  {.      p->lru =
13430 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
13440 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
13450 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
13460 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
13470 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20  p->iReg);.      
13480 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
13490 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
134a0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
134b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
134c0 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
134d0 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  v, pTab, iTable,
134e0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
134f0 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
13500 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13510 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d  geP5(v, p5);.  }
13520 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c  else{   .    sql
13530 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
13540 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c  re(pParse, iTabl
13550 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
13560 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13570 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  iReg;.}../*.** C
13580 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  lear all column 
13590 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a  cache entries..*
135a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
135b0 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72  prCacheClear(Par
135c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
135d0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
135e0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69  ColCache *p;..#i
135f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
13600 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
13610 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
13620 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
13630 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c  {.    printf("CL
13640 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  EAR\n");.  }.#en
13650 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
13660 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
13670 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
13680 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
13690 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
136a0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
136b0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
136c0 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
136d0 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
136e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
136f0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
13700 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
13710 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
13720 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
13730 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
13740 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
13750 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13760 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
13770 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
13780 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
13790 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
137a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
137b0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
137c0 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29   iStart, iCount)
137d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
137e0 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
137f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
13800 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
13810 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
13820 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
13830 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
13840 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
13850 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
13860 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
13870 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
13880 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
13890 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
138a0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
138b0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
138c0 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 69   *p;.  assert( i
138d0 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c  From>=iTo+nReg |
138e0 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54  | iFrom+nReg<=iT
138f0 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  o );.  sqlite3Vd
13900 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
13910 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
13920 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
13930 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  g);.  for(i=0, p
13940 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
13950 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
13960 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
13970 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  +){.    int x = 
13980 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
13990 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69   x>=iFrom && x<i
139a0 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20  From+nReg ){.   
139b0 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54     p->iReg += iT
139c0 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20  o-iFrom;.    }. 
139d0 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
139e0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
139f0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13a00 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
13a10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
13a20 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
13a30 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
13a40 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
13a50 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
13a60 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
13a70 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
13a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13a90 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  e is used within
13aa0 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
13ab0 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20  stcase() macros 
13ac0 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  only.** and does
13ad0 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61   not appear in a
13ae0 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a   normal build..*
13af0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
13b00 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
13b10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13b20 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
13b30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
13b40 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13b50 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
13b60 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13b70 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13b80 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13b90 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
13ba0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
13bb0 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
13bc0 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  To ) return 1;  
13bd0 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
13be0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
13bf0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13c00 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45  _DEBUG || SQLITE
13c10 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
13c20 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
13c30 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
13c40 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
13c50 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76  STER.*/.static v
13c60 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
13c70 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
13c80 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20  iReg){.  p->op2 
13c90 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
13ca0 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
13cb0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
13cc0 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
13cd0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
13ce0 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ip);.}../*.** Ge
13cf0 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
13d00 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
13d10 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
13d20 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
13d30 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
13d40 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
13d50 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
13d60 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
13d70 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
13d80 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
13d90 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
13da0 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
13db0 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
13dc0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
13dd0 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
13de0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
13df0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
13e00 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
13e10 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
13e20 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
13e30 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
13e40 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
13e50 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
13e60 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
13e70 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
13e80 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
13e90 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
13ea0 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
13eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
13ec0 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
13ed0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13ee0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
13ef0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
13f00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
13f10 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
13f20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
13f30 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
13f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13f50 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
13f60 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
13f70 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
13f80 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
13f90 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
13fa0 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
13fb0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
13fc0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
13fd0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
13fe0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
13ff0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
14000 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
14010 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
14020 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
14030 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
14040 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20  /.  int r1, r2, 
14050 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a  r3, r4;       /*
14060 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
14070 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73  r numbers */.  s
14080 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
14090 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
140a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
140b0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65  ion */.  Expr te
140c0 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  mpX;            
140d0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
140e0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
140f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  */..  assert( ta
14100 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
14110 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
14120 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
14130 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14140 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
14150 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
14160 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
14170 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
14180 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
14190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
141a0 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
141b0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
141c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
141d0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
141e0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
141f0 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
14200 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
14210 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
14220 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
14230 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
14240 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
14250 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
14260 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
14270 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
14280 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
14290 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
142a0 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
142b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
142c0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
142d0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
142e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
142f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
14300 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
14310 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
14340 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
14350 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14360 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14370 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
14380 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
14390 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
143a0 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
143b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
143c0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
143d0 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
143e0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
143f0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
14400 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
14410 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
14420 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
14430 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
14440 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
14450 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
14460 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
14470 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
14480 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
14490 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
144a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
144b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
144c0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67       /* Deleting
144d0 20 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20   from a partial 
144e0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
144f0 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65     iTab = pParse
14500 2d 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20  ->iPartIdxTab;. 
14510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14520 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
14530 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
14540 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
14550 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
14580 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  r->iColumn, iTab
14590 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
145c0 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  op2);.      brea
145d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
145e0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
145f0 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
14600 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
14610 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14640 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
14650 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  NT.    case TK_F
14660 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  LOAT: {.      as
14670 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
14680 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
14690 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
146a0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
146b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
146c0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
146d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
146e0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
146f0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
14700 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
14710 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
14720 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
14730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14750 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72  _String8, 0, tar
14760 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  get, 0, pExpr->u
14770 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20  .zToken, 0);.   
14780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14790 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
147a0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
147b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
147c0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
147d0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
147e0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
147f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
14800 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
14810 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
14820 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
14830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
14840 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
14850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14860 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14870 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
14880 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
14890 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
148a0 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
148b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
148c0 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
148d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
148e0 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
148f0 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
14900 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
14910 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
14920 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
14930 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
14940 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
14950 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
14960 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
14970 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
14980 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
14990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149a0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
149b0 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
149c0 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
149d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
149e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
149f0 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
14a00 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
14a10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
14a20 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
14a30 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
14a40 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
14a50 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
14a60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
14a70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
14a80 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
14a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14aa0 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
14ab0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
14ac0 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
14ad0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
14ae0 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
14af0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14b00 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
14b10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
14b20 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
14b30 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65  u.zToken, pParse
14b40 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
14b50 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b  Column-1])==0 );
14b60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14b70 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
14b80 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  -1, pParse->azVa
14b90 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
14ba0 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  -1], P4_STATIC);
14bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14bc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14bd0 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
14be0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
14bf0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
14c00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14c10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14c20 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  AS: {.      inRe
14c30 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
14c40 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
14c50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14c60 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
14c70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
14c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14c90 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
14ca0 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
14cb0 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
14cc0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
14cd0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
14ce0 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  ) */.      int a
14cf0 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20  ff, to_op;.     
14d00 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
14d10 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14d20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14d30 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
14d40 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
14d50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14d60 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
14d70 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   );.      aff = 
14d80 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
14d90 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
14da0 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 74  ken, 0);.      t
14db0 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
14dc0 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
14dd0 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
14de0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14df0 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
14e00 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
14e10 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
14e20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14e30 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
14e40 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14e50 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
14e60 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14e70 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
14e80 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
14e90 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
14ea0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14eb0 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
14ec0 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
14ed0 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
14ee0 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
14ef0 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
14f00 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
14f10 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
14f20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
14f30 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20  =OP_ToText );.  
14f40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
14f50 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29  _op==OP_ToBlob )
14f60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14f70 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ( to_op==OP_ToNu
14f80 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74  meric );.      t
14f90 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
14fa0 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20  OP_ToInt );.    
14fb0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
14fc0 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a  p==OP_ToReal );.
14fd0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
14fe0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
14ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15000 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
15010 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
15020 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
15030 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
15040 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
15050 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f  dbeAddOp1(v, to_
15060 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  op, inReg);.    
15070 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
15080 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
15090 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
150a0 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
150b0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
150c0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
150d0 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
150e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
150f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15100 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
15110 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
15120 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
15130 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
15140 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
15150 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
15160 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
15170 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
15180 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15190 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
151a0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
151b0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
151c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
151d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
151e0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
151f0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
15200 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
15210 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
15220 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
15250 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
15260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
15270 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
15280 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
15290 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
152a0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
152b0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
152c0 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
152d0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
152e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
152f0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
15300 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
15310 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
15320 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
15330 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
15340 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
15350 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
15360 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
15370 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
15380 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
15390 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
153a0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
153b0 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
153c0 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
153d0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
153e0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
153f0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
15400 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
15410 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
15420 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
15430 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
15440 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
15450 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
15460 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
15470 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
15480 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15490 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
154a0 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
154b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
154c0 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
154d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
154e0 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
154f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
15500 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15510 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
15520 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
15530 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
15540 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15550 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15560 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
15570 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
15580 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
15590 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  NE;.      codeCo
155a0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
155b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
155c0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155e0 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
155f0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
15600 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
15610 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
15620 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
15630 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
15640 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
15650 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74  =TK_NE);.      t
15660 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15670 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
15680 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
15690 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
156a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
156b0 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
156c0 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
156d0 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
156e0 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
156f0 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
15700 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
15710 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
15720 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
15730 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
15740 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
15750 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
15760 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
15770 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
15780 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
15790 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
157a0 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
157b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
157c0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
157d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
157e0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
157f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
15800 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
15810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
15820 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
15830 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
15840 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
15850 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
15860 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
15870 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
15880 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15890 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
158a0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
158b0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
158c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
158d0 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
158e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
158f0 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
15900 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
15910 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
15920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15930 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
15940 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
15950 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
15960 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
15970 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
15980 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
15990 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
159a0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
159b0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
159c0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
159d0 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
159e0 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
159f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15a00 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
15a10 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
15a20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
15a30 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
15a40 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
15a50 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
15a60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15a70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
15a80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15a90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15aa0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15ab0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
15ac0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
15ad0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15ae0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
15af0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
15b00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15b10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
15b20 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
15b30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15b40 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
15b50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15b60 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
15b70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15b80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
15b90 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
15ba0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
15bb0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
15bc0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
15bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
15be0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
15bf0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
15c00 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
15c10 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
15c20 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
15c30 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
15c40 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
15c50 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
15c60 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
15c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15c80 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15c90 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
15ca0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
15cb0 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
15cc0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
15cd0 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
15ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15cf0 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
15d00 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
15d10 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
15d20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
15d30 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
15d40 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
15d50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
15d60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15d70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
15d80 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
15d90 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
15da0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15db0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
15dc0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
15dd0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
15de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15df0 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
15e00 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
15e10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
15e20 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
15e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15e40 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
15e50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
15e70 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
15e80 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
15e90 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
15ea0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
15eb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15ec0 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
15ed0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
15ee0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
15ef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15f00 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
15f10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15f20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15f30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15f40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15f50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
15f60 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
15f70 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
15f80 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
15f90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
15fa0 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
15fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15fc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
15fd0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
15fe0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
15ff0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
16000 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
16010 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
16020 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
16030 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
16040 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16050 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
16060 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
16070 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
16080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16090 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
160a0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
160b0 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
160c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
160d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
160e0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
160f0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
16100 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
16110 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
16120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16130 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
16140 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
16150 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
16160 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
16170 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16180 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
16190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
161a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
161b0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
161c0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
161d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
161e0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
161f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16200 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
16210 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
16220 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
16230 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
16240 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
16250 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
16260 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
16270 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16280 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
162a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
162b0 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
162c0 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
162d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
162e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
162f0 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
16300 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
16310 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
16320 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16330 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16340 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
16350 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
16360 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
16370 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
16380 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
16390 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
163a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
163b0 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
163c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
163d0 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
163e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
163f0 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
16400 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
16410 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
16420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
16430 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74  gth of the funct
16440 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  ion name in byte
16450 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
16460 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
16470 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
16480 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
16490 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  u32 constMask = 
164a0 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
164b0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
164c0 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
164d0 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
164e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
164f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
16500 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
16510 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
16520 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
16530 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
16540 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
16550 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
16560 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
16570 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
16580 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
16590 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
165a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
165b0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
165c0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
165d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
165e0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
165f0 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
16600 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
16610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
16620 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
16630 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
16640 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
16650 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
16660 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
16670 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
16680 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16690 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
166a0 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
166b0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
166c0 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
166d0 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
166e0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
166f0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
16700 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67   zId, nId, nFarg
16710 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
16720 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
16730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16740 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16750 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
16760 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  n: %.*s()", nId,
16770 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62   zId);.        b
16780 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
16790 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
167a0 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65  a direct impleme
167b0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ntation of the b
167c0 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45  uilt-in COALESCE
167d0 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  () and.      ** 
167e0 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f  IFNULL() functio
167f0 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  ns.  This avoids
16800 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61   unnecessary eva
16810 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  lation of.      
16820 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
16830 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
16840 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
16850 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16860 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
16870 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
16880 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
16890 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
168a0 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
168b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
168c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
168d0 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
168e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
168f0 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
16900 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
16910 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
16920 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
16930 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
16940 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16950 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
16960 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
16970 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
16980 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
16990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
169a0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
169b0 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67  ove(pParse, targ
169c0 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  et, 1);.        
169d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
169e0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
169f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16a00 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
16a10 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
16a20 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
16a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16a40 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
16a50 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  se, 1);.        
16a60 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16a70 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16a80 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
16a90 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
16aa0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16ab0 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
16ac0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
16ad0 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
16ae0 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
16af0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
16b00 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
16b10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16b20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
16b30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
16b40 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
16b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
16b60 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
16b70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16b80 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
16b90 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
16ba0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
16bb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
16bc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
16bd0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
16be0 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
16bf0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
16c00 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
16c10 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
16c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16c30 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
16c40 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
16c50 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
16c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16c70 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
16c80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
16c90 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
16ca0 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
16cb0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
16cc0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
16cd0 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
16ce0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
16cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16d00 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
16d10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
16d20 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
16d30 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
16d40 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
16d50 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
16d60 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
16d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16d80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16d90 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
16da0 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
16db0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
16dc0 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
16dd0 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
16de0 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
16df0 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
16e00 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
16e10 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
16e20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
16e30 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
16e40 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
16e50 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
16e60 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
16e70 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
16e80 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
16e90 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
16ea0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
16eb0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
16ec0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
16ed0 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
16ee0 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
16ef0 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
16f00 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
16f10 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
16f20 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
16f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16f40 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
16f50 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
16f60 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
16f70 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
16f80 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
16f90 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
16fa0 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
16fb0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
16fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
16fd0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
16fe0 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
16ff0 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
17000 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
17010 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
17020 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
17030 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
17040 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17050 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
17060 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
17070 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
17080 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
17090 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
170b0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
170c0 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
170d0 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
170e0 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
170f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
17100 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17110 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
17120 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
17130 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
17140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17150 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
17160 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
17170 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
171a0 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
171b0 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
171c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
171d0 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b  ePop(pParse, 1);
171e0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
171f0 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
17200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17210 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
17220 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17230 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
17240 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
17250 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
17260 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
17270 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
17280 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
17290 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
172a0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
172b0 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
172c0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
172d0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
172e0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
172f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
17300 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
17310 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
17320 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
17330 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
17340 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
17350 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
17360 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
17370 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
17380 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
17390 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
173a0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
173b0 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
173c0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
173d0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
173e0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
173f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17400 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
17410 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
17420 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
17430 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
17440 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
17450 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
17460 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
17470 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
17480 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
17490 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
174a0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
174b0 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
174c0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
174d0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
174e0 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
174f0 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
17500 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
17510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
17520 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
17530 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
17540 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
17550 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
17560 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
17570 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
17580 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
17590 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
175a0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
175b0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
175c0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
175d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
175e0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
175f0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
17600 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
17610 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
17620 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
17630 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
17640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17650 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
17660 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
17670 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
17680 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
17690 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
176a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
176b0 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
176c0 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
176d0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
176e0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
176f0 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
17700 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
17710 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17720 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
17730 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26       if( nFarg &
17740 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29  & constMask==0 )
17750 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17760 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
17770 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
17780 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
17790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
177a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
177b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
177c0 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
177d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
177e0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  LECT: {.      te
177f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
17800 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
17810 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17820 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
17830 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
17840 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
17850 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
17860 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17870 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17880 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
17890 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
178a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
178b0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
178c0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
178d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
178e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
178f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17900 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
17910 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
17920 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
17930 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
17940 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
17950 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
17960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17970 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17980 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
17990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
179a0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
179b0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
179c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
179d0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
179e0 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
179f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
17a00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
17a10 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
17a20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17a30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
17a40 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17a50 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
17a60 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
17a70 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
17a80 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
17a90 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
17aa0 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
17ab0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
17ac0 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
17ad0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
17ae0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
17af0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
17b00 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
17b10 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
17b20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
17b30 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
17b40 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
17b50 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
17b60 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
17b70 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
17b80 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
17b90 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17ba0 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
17bb0 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  x.pList->a;.    
17bc0 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
17bd0 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
17be0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
17bf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17c00 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
17c10 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17c20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17c30 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17c40 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
17c50 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
17c60 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17c70 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
17c80 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
17c90 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
17ca0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17cb0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17cc0 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
17cd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17ce0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
17cf0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
17d00 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
17d30 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20  LITE_STOREP2);  
17d40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17d50 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
17d60 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
17d70 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
17d80 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
17d90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17da0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
17db0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17dc0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17dd0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
17de0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
17df0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17e00 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
17e10 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
17e20 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
17e30 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
17e40 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
17e50 50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  P2);.      VdbeC
17e60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e80 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
17e90 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
17ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
17eb0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
17ec0 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
17ed0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17ee0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
17ef0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17f00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17f10 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
17f20 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
17f30 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
17f40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
17f50 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
17f60 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
17f70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17f80 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
17f90 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
17fa0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
17fb0 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
17fc0 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
17fd0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
17fe0 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
17ff0 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
18000 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
18010 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
18020 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
18030 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
18040 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
18050 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
18060 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
18070 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
18080 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
18090 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
180a0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
180b0 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
180c0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
180d0 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
180e0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
180f0 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
18100 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
18110 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
18120 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
18130 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
18140 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
18150 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
18160 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
18170 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
18180 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
18190 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
181a0 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
181b0 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
181c0 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
181d0 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
181e0 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
181f0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
18200 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
18210 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
18220 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
18230 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
18240 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
18250 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
18260 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
18270 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
18280 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
18290 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
182a0 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
182b0 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
182c0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
182d0 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
182e0 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
182f0 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
18300 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
18310 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
18320 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
18330 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
18340 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
18350 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
18360 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
18370 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
18380 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
18390 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
183a0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
183b0 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
183c0 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
183d0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
183e0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
183f0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
18400 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
18410 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
18420 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
18430 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
18440 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
18450 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
18460 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
18470 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
18480 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
18490 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
184a0 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
184b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
184c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
184d0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
184e0 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
184f0 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
18500 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
18510 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
18520 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18530 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
18540 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
18550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18560 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
18570 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
18580 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
18590 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
185a0 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
185b0 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
185c0 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
185d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
185e0 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
185f0 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
18600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18610 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
18620 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
18630 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
18640 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
18650 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
18660 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
18670 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
18680 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
18690 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
186a0 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
186b0 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
186c0 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
186d0 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
186e0 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
186f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18700 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
18710 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
18720 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
18730 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
18740 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
18750 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
18760 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
18770 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
18780 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
18790 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20  is really real. 
187a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
187b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
187c0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
187d0 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
187e0 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
187f0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
18800 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18820 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
18830 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
18840 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
18850 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18860 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
18870 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
18880 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
18890 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
188a0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
188b0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
188c0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
188d0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
188e0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
188f0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
18900 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
18910 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
18920 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
18930 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
18940 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
18950 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
18960 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
18970 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
18980 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
18990 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
189a0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
189b0 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
189c0 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
189d0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
189e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
189f0 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
18a00 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
18a10 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
18a20 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
18a30 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
18a40 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
18a50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
18a60 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
18a70 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
18a80 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
18a90 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
18aa0 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
18ab0 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
18ac0 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
18ad0 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
18ae0 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
18af0 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
18b00 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
18b10 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
18b20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
18b30 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
18b40 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
18b50 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
18b60 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
18b70 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
18b80 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
18b90 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
18ba0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
18bb0 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
18bc0 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
18bd0 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
18be0 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
18bf0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
18c00 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
18c10 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
18c20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c40 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
18c50 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
18c60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
18c70 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
18c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
18c90 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
18ca0 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
18cb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
18cc0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
18cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
18ce0 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
18cf0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
18d00 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
18d30 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
18d40 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
18d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
18d60 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
18d70 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
18d80 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18d90 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
18da0 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
18db0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
18dc0 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18de0 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
18df0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
18e00 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
18e30 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
18e40 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e60 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
18e70 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
18e80 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
18e90 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
18ea0 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
18eb0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
18ec0 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
18ed0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
18ee0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
18ef0 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
18f00 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
18f10 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
18f20 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
18f30 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
18f40 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
18f50 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
18f60 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
18f70 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
18f80 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
18f90 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
18fa0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18fb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
18fc0 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
18fd0 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
18fe0 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
18ff0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19000 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
19010 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
19020 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
19030 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78  tempX, sqlite3Ex
19040 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19050 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
19060 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
19070 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19080 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  0 );.        opC
19090 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
190a0 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
190b0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
190c0 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
190d0 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
190e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
190f0 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
19100 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
19110 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
19120 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
19130 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
19140 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
19150 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
19160 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
19170 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
19180 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
19190 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
191a0 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
191b0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
191c0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
191d0 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
191e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
191f0 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
19200 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
19210 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
19220 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
19230 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
19240 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19250 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
19260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
19270 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
19280 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
19290 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
192a0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
192b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
192c0 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
192d0 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
192e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
192f0 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
19300 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19310 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
19320 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
19330 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
19340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19350 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19360 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
19370 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
19380 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
19390 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
193a0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
193b0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
193c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
193d0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
193e0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
193f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
19400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19410 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19420 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
19430 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
19440 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
19450 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  pParse, 1);.    
19460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19470 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
19480 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
19490 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
194a0 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
194b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
194c0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
194d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
194e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
194f0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
19500 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
19510 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
19520 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
19530 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
19540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19560 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
19570 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
19580 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
19590 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
195a0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
195b0 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
195c0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
195d0 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
195e0 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
195f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19600 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
19610 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
19620 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
19630 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
19640 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
19650 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
19660 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
19670 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
19680 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
19690 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
196a0 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
196b0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
196c0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
196d0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
196e0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
196f0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
19700 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
19710 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
19720 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
19730 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19740 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
19760 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
19770 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
19780 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
19790 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
197a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
197b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
197c0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
197d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
197e0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
197f0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
19800 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
19810 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
19820 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
19830 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( 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 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
19860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19870 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
19880 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
19890 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
198a0 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
198b0 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
198c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
198d0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
198e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
198f0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
19900 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
19910 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
19920 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
19950 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
19960 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
19970 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
19980 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
19990 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
199a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
199b0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
199c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
199d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
199e0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
199f0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
19a00 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
19a10 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
19a20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
19a30 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
19a40 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
19a50 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
19a60 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
19a70 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
19a80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
19a90 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
19aa0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
19ab0 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
19ac0 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
19ad0 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
19ae0 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53  gDest,      /* S
19af0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
19b00 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
19b10 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65  */.  u8 reusable
19b20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
19b30 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  f this expressio
19b40 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f  n is reusable */
19b50 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
19b60 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
19b70 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
19b80 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
19b90 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
19ba0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
19bb0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
19bc0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
19bd0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
19be0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
19bf0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
19c00 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
19c10 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
19c20 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
19c30 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
19c40 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
19c50 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
19c60 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65  gDest;.     pIte
19c70 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
19c80 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50  usable;.  }.  pP
19c90 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
19ca0 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = p;.}../*.** G
19cb0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19cc0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
19cd0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
19ce0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
19cf0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
19d00 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
19d10 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
19d20 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
19d30 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
19d40 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
19d50 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
19d60 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
19d70 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
19d80 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
19d90 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
19da0 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
19db0 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
19dc0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
19dd0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
19de0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
19df0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
19e00 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
19e10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
19e20 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
19e30 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
19e40 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
19e50 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
19e60 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
19e70 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
19e80 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
19e90 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
19ea0 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
19eb0 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
19ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19ed0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
19ee0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
19ef0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
19f00 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
19f10 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
19f20 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
19f30 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
19f40 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
19f50 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
19f60 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
19f70 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
19f80 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
19f90 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  r).  ){.    Expr
19fa0 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65  List *p = pParse
19fb0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
19fc0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52    int i;.    *pR
19fd0 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eg  = 0;.    if(
19fe0 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75   p ){.      stru
19ff0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1a000 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1a010 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
1a020 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
1a030 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
1a040 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1a050 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
1a060 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1a070 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  (pItem->pExpr,pE
1a080 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
1a090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1a0a0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1a0b0 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  prReg;.        }
1a0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a0d0 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65     r2 = ++pParse
1a0e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1a0f0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1a100 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1a110 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65   r2, 1);.  }else
1a120 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
1a130 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1a140 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
1a150 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a160 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1a170 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1a180 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
1a190 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
1a1a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a1b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a1c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1a1d0 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
1a1e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1a1f0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
1a200 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1a210 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1a220 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
1a230 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
1a240 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
1a250 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1a260 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1a270 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1a280 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
1a290 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1a2a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a2b0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
1a2c0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1a2d0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1a2e0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
1a2f0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1a300 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1a310 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1a320 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
1a330 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
1a340 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
1a350 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1a360 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1a370 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
1a380 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
1a390 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
1a3a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a3b0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1a3c0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1a3d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a3e0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
1a3f0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1a400 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
1a410 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1a420 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
1a430 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a440 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1a450 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1a460 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1a470 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
1a480 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a490 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1a4a0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
1a4b0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
1a4c0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1a4d0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
1a4e0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1a4f0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
1a500 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
1a510 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1a520 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
1a530 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
1a540 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1a550 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
1a560 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
1a570 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
1a580 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1a590 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1a5a0 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1a5b0 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
1a5c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1a5d0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1a5e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
1a5f0 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
1a600 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1a610 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1a620 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a630 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1a640 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1a650 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1a660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a670 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1a680 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
1a690 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1a6a0 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
1a6b0 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
1a6c0 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
1a6d0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
1a6e0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1a6f0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
1a700 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1a710 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
1a720 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
1a730 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
1a740 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
1a750 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1a760 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
1a770 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
1a780 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
1a790 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
1a7a0 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
1a7b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1a7c0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1a7d0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
1a7e0 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
1a7f0 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
1a800 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
1a810 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
1a820 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
1a830 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
1a840 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
1a850 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1a860 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1a870 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1a880 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1a890 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1a8a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1a8b0 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
1a8c0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1a8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1a8e0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1a8f0 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
1a900 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1a910 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1a920 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
1a930 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1a940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a950 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
1a960 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
1a970 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
1a980 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  iMem);.}..#if de
1a990 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1a9a0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1a9b0 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
1a9c0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
1a9d0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
1a9e0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1a9f0 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
1aa00 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1aa10 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
1aa20 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
1aa30 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
1aa40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
1aa50 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
1aa60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1aa70 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f  *zBinOp = 0;   /
1aa80 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  * Binary operato
1aa90 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
1aaa0 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20  r *zUniOp = 0;  
1aab0 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74   /* Unary operat
1aac0 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  or */.  if( pExp
1aad0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
1aae0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
1aaf0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
1ab00 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
1ab10 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1ab20 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1ab30 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
1ab40 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ab50 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25 64  pOut, "AGG{%d:%d
1ab60 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  }",.            
1ab70 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
1ab80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1ab90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aba0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1abb0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
1abc0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
1abd0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
1abe0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
1abf0 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63  ns when coding c
1ac00 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
1ac10 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1ac20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ac30 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25  (pOut, "COLUMN(%
1ac40 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  d)", pExpr->iCol
1ac50 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
1ac60 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1ac70 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ac80 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c  pOut, "{%d:%d}",
1ac90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1acb0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
1acc0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1acd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ace0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1acf0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1ad00 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1ad10 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1ad20 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alue ){.        
1ad30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1ad40 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22 2c  intf(pOut, "%d",
1ad50 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1ad60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1ad70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ad80 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ad90 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  t, "%s", pExpr->
1ada0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1adb0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1adc0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1add0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1ade0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
1adf0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
1ae00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ae10 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1ae20 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
1ae30 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1ae40 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1ae50 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
1ae60 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
1ae70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ae80 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78 70  (pOut,"%Q", pExp
1ae90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1aea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aeb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1aec0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1aed0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1aee0 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  pOut,"NULL");.  
1aef0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1af00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1af10 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1af20 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1af30 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OB: {.      sqli
1af40 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1af50 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
1af60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1af70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1af80 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1af90 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1afa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1afb0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1afc0 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29  "VARIABLE(%s,%d)
1afd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1aff0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  xpr->u.zToken, p
1b000 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1b010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b020 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
1b030 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
1b040 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b050 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47 49  rintf(pOut,"REGI
1b060 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70 72  STER(%d)", pExpr
1b070 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
1b080 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b090 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
1b0a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b0b0 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1b0c0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1b0d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b0e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b0f0 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
1b100 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
1b110 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1b120 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
1b130 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
1b140 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
1b150 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66  const char *zAff
1b160 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1b170 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 41  switch( sqlite3A
1b180 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
1b190 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 20  r->u.zToken, 0) 
1b1a0 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
1b1b0 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a  SQLITE_AFF_TEXT:
1b1c0 20 20 20 20 7a 41 66 66 20 3d 20 22 54 45 58 54      zAff = "TEXT
1b1d0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b1e0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1b1f0 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a  E_AFF_NONE:    z
1b200 41 66 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20  Aff = "NONE";   
1b210 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b220 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1b230 5f 4e 55 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d  _NUMERIC: zAff =
1b240 20 22 4e 55 4d 45 52 49 43 22 3b 20 20 62 72 65   "NUMERIC";  bre
1b250 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1b260 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
1b270 47 45 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54  GER: zAff = "INT
1b280 45 47 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20  EGER";  break;. 
1b290 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1b2a0 54 45 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20 20  TE_AFF_REAL:    
1b2b0 7a 41 66 66 20 3d 20 22 52 45 41 4c 22 3b 20 20  zAff = "REAL";  
1b2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b2d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1b2e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b2f0 74 2c 20 22 43 41 53 54 2d 25 73 28 22 2c 20 7a  t, "CAST-%s(", z
1b300 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Aff);.      sqli
1b310 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1b320 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Out, pExpr->pLef
1b330 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1b340 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b350 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1b360 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1b370 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b380 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
1b390 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
1b3a0 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20   zBinOp = "LT"; 
1b3b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b3c0 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
1b3d0 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20  zBinOp = "LE";  
1b3e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b3f0 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a  se TK_GT:      z
1b400 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20  BinOp = "GT";   
1b410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b420 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42  e TK_GE:      zB
1b430 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20  inOp = "GE";    
1b440 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b450 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69   TK_NE:      zBi
1b460 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20  nOp = "NE";     
1b470 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b480 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e  TK_EQ:      zBin
1b490 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62  Op = "EQ";     b
1b4a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b4b0 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_IS:      zBinO
1b4c0 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72  p = "IS";     br
1b4d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b4e0 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70  _ISNOT:   zBinOp
1b4f0 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65   = "ISNOT";  bre
1b500 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b510 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  AND:     zBinOp 
1b520 3d 20 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61  = "AND";    brea
1b530 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  k;.    case TK_O
1b540 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  R:      zBinOp =
1b550 20 22 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b   "OR";     break
1b560 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  ;.    case TK_PL
1b570 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  US:    zBinOp = 
1b580 22 41 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "ADD";    break;
1b590 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
1b5a0 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  R:    zBinOp = "
1b5b0 4d 55 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  MUL";    break;.
1b5c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
1b5d0 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53  S:   zBinOp = "S
1b5e0 55 42 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  UB";    break;. 
1b5f0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20     case TK_REM: 
1b600 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45      zBinOp = "RE
1b610 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  M";    break;.  
1b620 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
1b630 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54  :  zBinOp = "BIT
1b640 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  AND"; break;.   
1b650 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
1b660 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f    zBinOp = "BITO
1b670 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  R";  break;.    
1b680 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
1b690 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b   zBinOp = "DIV";
1b6a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b6b0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20  ase TK_LSHIFT:  
1b6c0 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54  zBinOp = "LSHIFT
1b6d0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1b6e0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a  se TK_RSHIFT:  z
1b6f0 42 69 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22  BinOp = "RSHIFT"
1b700 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1b710 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42  e TK_CONCAT:  zB
1b720 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b  inOp = "CONCAT";
1b730 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1b740 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55  e TK_UMINUS:  zU
1b750 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b  niOp = "UMINUS";
1b760 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b770 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e   TK_UPLUS:   zUn
1b780 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20  iOp = "UPLUS";  
1b790 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b7a0 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69  TK_BITNOT:  zUni
1b7b0 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62  Op = "BITNOT"; b
1b7c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b7d0 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f  K_NOT:     zUniO
1b7e0 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72  p = "NOT";    br
1b7f0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b800 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70  _ISNULL:  zUniOp
1b810 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65   = "ISNULL"; bre
1b820 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b830 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20  NOTNULL: zUniOp 
1b840 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
1b850 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1b860 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
1b870 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b880 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1b890 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1b8a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b8b0 69 6e 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c  intf(pOut,".COLL
1b8c0 41 54 45 28 25 73 29 22 2c 70 45 78 70 72 2d 3e  ATE(%s)",pExpr->
1b8d0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1b8e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b8f0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1b900 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
1b910 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
1b920 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1b930 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
1b940 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
1b950 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1b960 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1b970 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b980 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1b990 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1b9a0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1b9b0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1b9c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1b9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b9e0 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  f( op==TK_AGG_FU
1b9f0 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  NCTION ){.      
1ba00 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1ba10 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47  Printf(pOut, "AG
1ba20 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25 73 28  G_FUNCTION%d:%s(
1ba30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70  pExpr->op2, pExp
1ba60 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1ba70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ba90 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 46  nPrintf(pOut, "F
1baa0 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20 70 45  UNCTION:%s(", pE
1bab0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1bac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bad0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1bae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1baf0 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1bb00 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  pFarg);.      }.
1bb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bb20 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bb30 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1bb40 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1bb50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1bb60 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1bb70 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20  TK_EXISTS: {.   
1bb80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bb90 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 45  nPrintf(pOut, "E
1bba0 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20 20 20  XISTS(");.      
1bbb0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1bbc0 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1bbd0 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1bbe0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bbf0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29  inPrintf(pOut,")
1bc00 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1bc10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bc20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1bc30 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bc40 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1bc50 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1bc60 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
1bc70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Out, pExpr->x.pS
1bc80 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
1bc90 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1bca0 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1bcb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bcc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
1bcd0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1bce0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1bcf0 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20 20 20  Out, "IN(");.   
1bd00 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bd10 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1bd20 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1bd30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bd40 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29  rintf(pOut, ",")
1bd50 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1bd60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1bd70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1bd80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1bd90 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
1bda0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1bdb0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
1bdc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1bdd0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1bde0 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1bdf0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1be00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1be10 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1be20 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1be30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1be40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1be50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1be60 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1be70 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1be80 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
1be90 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
1bea0 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
1beb0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
1bec0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
1bed0 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
1bee0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
1bef0 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
1bf00 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1bf10 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1bf20 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
1bf30 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1bf40 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1bf50 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1bf60 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1bf70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
1bf80 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1bf90 20 20 20 20 20 20 45 78 70 72 20 2a 70 59 20 3d        Expr *pY =
1bfa0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1bfb0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
1bfc0 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20 70 45     Expr *pZ = pE
1bfd0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1bfe0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
1bff0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c000 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45 54 57  intf(pOut, "BETW
1c010 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71  EEN(");.      sq
1c020 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1c030 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20 20 20  (pOut, pX);.    
1c040 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c050 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1c060 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c070 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1c080 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pY);.      sql
1c090 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c0a0 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1c0b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c0c0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 5a 29  inExpr(pOut, pZ)
1c0d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c0e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c0f0 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1c100 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c110 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
1c120 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
1c130 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
1c140 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
1c150 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1c160 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
1c170 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
1c180 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
1c190 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1c1a0 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
1c1b0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
1c1c0 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
1c1d0 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
1c1e0 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
1c1f0 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
1c200 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
1c210 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
1c220 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
1c230 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
1c240 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
1c250 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
1c260 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
1c270 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
1c280 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
1c290 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
1c2a0 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
1c2b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1c2c0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c2d0 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c 20 0a  Out, "%s(%d)", .
1c2e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1c2f0 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20  >iTable ? "NEW" 
1c300 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e  : "OLD", pExpr->
1c310 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1c320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c330 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
1c340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c350 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c360 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20 20 20  , "CASE(");.    
1c370 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c380 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c390 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
1c3a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c3b0 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1c3c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c3d0 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1c3e0 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1c3f0 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
1c400 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1c420 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1c430 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63  RAISE: {.      c
1c440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1c450 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1c460 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61  switch( pExpr->a
1c470 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
1c480 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
1c490 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22  ack:   zType = "
1c4a0 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61  rollback";  brea
1c4b0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1c4c0 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a  OE_Abort:      z
1c4d0 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20  Type = "abort"; 
1c4e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c4f0 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
1c500 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
1c510 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61  fail";      brea
1c520 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1c530 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a  OE_Ignore:     z
1c540 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b  Type = "ignore";
1c550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c560 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c570 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c580 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28 25 73  ut, "RAISE-%s(%s
1c590 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72  )", zType, pExpr
1c5a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1c5b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c5c0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
1c5d0 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73   zBinOp ){.    s
1c5e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c5f0 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20  ntf(pOut,"%s(", 
1c600 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  zBinOp);.    sql
1c610 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1c620 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1c630 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1c640 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c650 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73 71 6c  ut,",");.    sql
1c660 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1c670 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  pOut, pExpr->pRi
1c680 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ght);.    sqlite
1c690 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1c6a0 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65 6c 73  Out,")");.  }els
1c6b0 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a  e if( zUniOp ){.
1c6c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c6d0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1c6e0 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20  s(", zUniOp);.  
1c6f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c700 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72  Expr(pOut, pExpr
1c710 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
1c720 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c730 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20  tf(pOut,")");.  
1c740 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  }.}.#endif /* de
1c750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1c760 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1c770 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ) */..#if define
1c780 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c790 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
1c7a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1c7b0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1c7c0 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1c7d0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1c7e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c7f0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
1c800 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72  Vdbe *pOut, Expr
1c810 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1c820 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1c830 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
1c840 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nExpr==0 ){.    
1c850 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c860 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65 6d 70  intf(pOut, "(emp
1c870 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20 20 20  ty-list)");.    
1c880 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1c890 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
1c8a0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
1c8b0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1c8c0 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ut, pList->a[0].
1c8d0 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
1c8e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c8f0 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20  ainPush(pOut);. 
1c900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
1c910 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c920 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1c930 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c940 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d 20 22  t, "item[%d] = "
1c950 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
1c960 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
1c970 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Out);.      sqli
1c980 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1c990 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Out, pList->a[i]
1c9a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
1c9b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
1c9c0 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (pOut);.      if
1c9d0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1c9e0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1c9f0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1ca00 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25  ntf(pOut, " AS %
1ca10 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  s", pList->a[i].
1ca20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1ca30 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1ca40 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62  >a[i].bSpanIsTab
1ca50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ca60 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ca70 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20  (pOut, " (%s)", 
1ca80 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1ca90 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1caa0 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
1cab0 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
1cac0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1cad0 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  NL(pOut);.      
1cae0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1caf0 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f  te3ExplainPop(pO
1cb00 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ut);.  }.}.#endi
1cb10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1cb20 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  G */../*.** Gene
1cb30 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
1cb40 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
1cb50 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1cb60 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
1cb70 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1cb80 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
1cb90 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
1cba0 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
1cbb0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
1cbc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1cbd0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
1cbe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1cbf0 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
1cc00 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
1cc10 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
1cc20 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
1cc30 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
1cc40 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
1cc50 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
1cc60 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1cc70 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
1cc80 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
1cc90 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
1cca0 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
1ccb0 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
1ccc0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69  ation code..*/.i
1ccd0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1cce0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1ccf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cd00 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1cd10 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1cd20 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1cd30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1cd40 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1cd50 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1cd60 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1cd70 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1cd80 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
1cd90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1cda0 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
1cdb0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
1cdc0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1cdd0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
1cde0 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
1cdf0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1ce00 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
1ce10 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
1ce20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1ce30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1ce40 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1ce50 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1ce60 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1ce70 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1ce80 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1ce90 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1cea0 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
1ceb0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1cec0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1ced0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
1cee0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1cef0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
1cf00 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1cf10 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1cf20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
1cf30 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1cf40 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1cf50 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
1cf60 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1cf70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
1cf80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1cf90 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1cfa0 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
1cfb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cfc0 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
1cfd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1cfe0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1cff0 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
1d000 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1d010 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1d020 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
1d030 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
1d040 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1d050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1d060 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
1d070 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
1d080 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1d090 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
1d0a0 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1d0b0 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
1d0c0 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
1d0d0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1d0e0 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
1d0f0 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
1d100 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1d110 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
1d120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1d130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d140 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
1d150 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1d160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d180 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1d190 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1d1a0 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1d1b0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1d1c0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1d1d0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1d1e0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1d1f0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1d200 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1d210 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1d220 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1d230 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1d240 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1d250 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
1d260 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d270 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1d280 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d290 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1d2a0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1d2b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d2c0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1d2d0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
1d2e0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
1d2f0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1d300 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1d310 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20   if the jump is 
1d320 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a  taken */.  int j
1d330 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20  umpIfTrue,   /* 
1d340 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1d350 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1d360 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  true */.  int ju
1d370 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
1d380 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1d390 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
1d3a0 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
1d3b0 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
1d3c0 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
1d3d0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
1d3e0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
1d3f0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
1d400 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
1d410 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
1d420 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
1d430 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
1d440 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
1d450 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
1d460 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1d470 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1d480 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
1d490 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
1d4a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d4b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1d4c0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1d4d0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1d4e0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1d4f0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1d500 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
1d510 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
1d520 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
1d530 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
1d540 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
1d550 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
1d560 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1d570 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
1d580 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d590 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1d5a0 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
1d5b0 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
1d5c0 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
1d5d0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
1d5e0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1d5f0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1d600 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
1d610 73 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c  ster(&exprX, sql
1d620 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1d630 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
1d640 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
1d650 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29  if( jumpIfTrue )
1d660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d670 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1d680 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1d690 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1d6a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1d6b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1d6c0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1d6d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d6e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
1d6f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1d700 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1d710 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
1d720 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
1d730 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
1d740 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1d750 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1d760 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1d770 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1d780 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1d790 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1d7a0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1d7b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1d7c0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1d7d0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1d7e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1d7f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d800 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1d810 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1d820 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1d830 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d840 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1d850 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1d860 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1d870 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1d880 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1d890 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1d8a0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d8b0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1d8c0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1d8d0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1d8e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1d8f0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1d900 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1d910 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1d920 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1d930 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1d940 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1d950 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1d960 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1d970 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1d980 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1d990 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
1d9a0 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1d9b0 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1d9c0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1d9d0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
1d9e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1d9f0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1da00 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1da10 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1da20 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
1da30 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1da40 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
1da50 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1da60 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
1da70 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
1da80 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
1da90 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
1daa0 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
1dab0 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
1dac0 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
1dad0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
1dae0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
1daf0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1db00 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
1db10 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
1db20 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
1db30 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
1db40 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
1db50 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
1db60 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
1db70 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
1db80 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
1db90 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
1dba0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
1dbb0 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
1dbc0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
1dbd0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1dbe0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1dbf0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1dc00 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1dc10 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1dc20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1dc30 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1dc40 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1dc50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1dc60 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1dc70 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1dc80 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1dc90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1dca0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1dcb0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1dcc0 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
1dcd0 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
1dce0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1dcf0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1dd00 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
1dd10 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
1dd20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
1dd30 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
1dd40 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1dd50 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1dd60 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1dd70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1dd80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1dd90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1dda0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1ddb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1ddc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1ddd0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1dde0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
1ddf0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1de00 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1de10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1de20 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1de30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1de40 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1de50 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1de60 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1de70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1de80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1de90 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1dea0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1deb0 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
1dec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ded0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
1dee0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1def0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1df00 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1df10 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1df20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1df30 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1df40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1df50 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1df60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1df70 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1df80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1df90 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1dfa0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1dfb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1dfc0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1dfd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dfe0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dff0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1e000 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e010 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1e020 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e030 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e040 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1e050 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e060 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e070 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1e080 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1e090 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1e0a0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1e0b0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1e0c0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1e0d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e0e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e0f0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1e100 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e110 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e120 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1e130 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1e140 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e150 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e160 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1e170 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1e180 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1e190 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1e1a0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1e1d0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1e1e0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
1e1f0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
1e200 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
1e210 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e220 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
1e230 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
1e240 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
1e250 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
1e260 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1e270 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
1e280 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
1e290 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1e2a0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
1e2b0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e2c0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
1e2d0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
1e2e0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1e2f0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
1e300 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1e310 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
1e320 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
1e330 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e340 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
1e350 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
1e360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1e370 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
1e380 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
1e390 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1e3a0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
1e3b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e3c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e3d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e3e0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e3f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
1e410 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1e420 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1e430 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
1e440 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e450 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
1e460 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e470 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e480 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e490 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e4a0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1e4b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e4c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e4d0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e4e0 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
1e4f0 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
1e500 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
1e510 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1e520 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e530 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1e540 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1e550 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1e560 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f  2, dest, SQLITE_
1e570 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
1e580 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e590 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20   op==TK_EQ);.   
1e5a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1e5b0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b  f(v, op==TK_NE);
1e5c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e5d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e5e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e5f0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1e600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e610 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1e620 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
1e630 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
1e640 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
1e650 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
1e660 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1e670 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
1e680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1e690 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
1e6a0 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
1e6b0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
1e6c0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e6d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e6e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e6f0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e700 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
1e710 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e720 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
1e730 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e740 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
1e750 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
1e760 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1e770 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
1e780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e790 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e7a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e7b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
1e7c0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
1e7d0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e7e0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e7f0 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1e800 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1e810 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75  est, 1, jumpIfNu
1e820 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1e830 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1e840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1e850 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
1e860 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
1e870 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73   destIfFalse = s
1e880 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e890 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
1e8a0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a  t destIfNull = j
1e8b0 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74  umpIfNull ? dest
1e8c0 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   : destIfFalse;.
1e8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e8e0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1e8f0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1e900 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1e910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1e930 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1e940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e950 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e960 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1e970 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e980 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
1e990 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
1e9a0 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
1e9b0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1e9c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e9d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1e9e0 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
1e9f0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
1ea00 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
1ea10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
1ea20 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
1ea30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1ea40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ea50 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ea60 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
1ea70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ea80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ea90 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
1eaa0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
1eab0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1eac0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
1ead0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1eae0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1eaf0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1eb00 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1eb10 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1eb20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1eb30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1eb40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1eb50 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
1eb60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1eb70 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
1eb80 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
1eb90 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1eba0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1ebb0 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1ebc0 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1ebd0 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1ebe0 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1ebf0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
1ec00 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1ec10 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1ec20 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1ec30 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
1ec40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1ec50 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1ec60 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1ec70 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1ec80 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
1ec90 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
1eca0 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1ecb0 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
1ecc0 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
1ecd0 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
1ece0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1ecf0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
1ed00 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1ed10 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1ed20 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1ed30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1ed40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1ed50 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1ed60 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1ed70 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1ed80 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1ed90 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1eda0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1edb0 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1edc0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1edd0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
1ede0 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
1edf0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1ee00 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1ee10 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1ee20 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
1ee30 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
1ee40 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
1ee50 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
1ee60 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1ee70 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
1ee80 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
1ee90 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
1eea0 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
1eeb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
1eec0 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
1eed0 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
1eee0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1eef0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
1ef00 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
1ef10 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
1ef20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
1ef30 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
1ef50 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1ef60 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
1ef70 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
1ef80 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
1ef90 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
1efa0 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
1efb0 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
1efc0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1efe0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
1eff0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
1f000 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
1f010 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
1f020 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
1f030 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
1f040 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
1f050 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
1f060 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
1f070 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
1f080 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
1f090 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1f0a0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
1f0b0 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
1f0c0 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
1f0d0 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
1f0e0 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
1f0f0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
1f100 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
1f110 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
1f120 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
1f130 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
1f140 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1f150 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1f160 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f170 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
1f180 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
1f190 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f1a0 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
1f1b0 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
1f1c0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f1d0 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
1f1e0 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
1f1f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f200 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
1f210 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
1f220 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1f230 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
1f240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f250 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
1f260 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
1f270 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f280 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
1f290 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
1f2a0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f2b0 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
1f2c0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
1f2d0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1f2e0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1f2f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f300 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f310 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f320 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1f330 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1f340 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f360 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1f370 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1f380 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f390 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f3a0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1f3b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f3c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f3d0 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
1f3e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f3f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f400 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1f410 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f420 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f430 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f440 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f450 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f460 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f470 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1f480 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1f490 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f4a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f4b0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1f4c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f4d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f4e0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f4f0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f500 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f510 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f520 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1f530 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f540 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a  Pop(pParse, 1);.
1f550 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f560 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1f570 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1f580 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f590 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1f5a0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1f5b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f5c0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1f5d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1f5e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f5f0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1f600 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1f610 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1f620 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1f630 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1f640 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1f650 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f660 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f670 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f680 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f690 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f6a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f6b0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1f6c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f6d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f6e0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1f6f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1f700 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1f710 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1f720 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1f740 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1f750 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
1f760 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1f770 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1f780 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1f790 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1f7a0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
1f7b0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1f7c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f7d0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1f7e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f7f0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
1f800 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1f810 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f820 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1f830 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1f840 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f850 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1f860 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f870 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f880 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1f890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1f8a0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1f8b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1f8c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1f8d0 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1f8e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1f8f0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1f900 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1f910 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f920 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1f930 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f940 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f950 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f960 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f970 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f980 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1f990 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1f9a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f9b0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1f9c0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1f9d0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1f9e0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1f9f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1fa00 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1fa10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fa20 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1fa30 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1fa40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fa50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1fa60 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1fa70 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
1fa80 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
1fa90 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
1faa0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1fab0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1fac0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1fad0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1faf0 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1fb00 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1fb10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fb20 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20  v, op==TK_EQ);. 
1fb30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1fb40 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45  eIf(v, op==TK_NE
1fb50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fb60 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1fb70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fb80 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1fb90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fba0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fbb0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1fbc0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1fbd0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1fbe0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fbf0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fc00 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1fc10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fc20 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1fc30 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
1fc40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1fc50 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62  _ISNULL );   Vdb
1fc60 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1fc70 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1fc80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fc90 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1fca0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fcb0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1fcc0 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
1fcd0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1fce0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1fcf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fd00 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1fd10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1fd20 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1fd30 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1fd40 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1fd50 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d  pr, dest, 0, jum
1fd60 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1fd70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1fd80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fd90 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1fda0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1fdb0 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
1fdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fdd0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1fde0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1fdf0 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
1fe00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1fe10 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
1fe20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fe30 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1fe40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fe50 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1fe60 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
1fe70 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
1fe80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1fe90 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
1fea0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
1feb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fec0 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1fed0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
1fee0 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
1fef0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1ff00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ff10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1ff20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
1ff30 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
1ff40 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
1ff50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
1ff60 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
1ff70 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1ff80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ff90 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ffa0 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1ffb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ffc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ffd0 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
1ffe0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1fff0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
20000 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
20010 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20020 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20030 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20040 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
20050 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
20060 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
20070 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20080 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
20090 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
200a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
200b0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
200c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  );.}../*.** Do a
200d0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
200e0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
200f0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
20100 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
20110 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
20120 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
20130 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
20140 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
20150 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
20160 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
20170 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
20180 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
20190 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
201a0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
201b0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
201c0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
201d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
201e0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
201f0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
20200 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
20210 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
20220 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
20230 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
20240 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
20250 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
20260 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
20270 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
20280 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
20290 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
202a0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
202b0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
202c0 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
202d0 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
202e0 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
202f0 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
20300 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
20310 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
20320 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
20330 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
20340 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
20350 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
20360 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
20370 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
20380 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
20390 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
203a0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
203b0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
203c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
203d0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
203e0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
203f0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
20400 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
20410 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
20420 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
20430 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
20440 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
20450 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
20460 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
20470 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
20480 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
20490 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
204a0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
204b0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
204c0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
204d0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
204e0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
204f0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
20500 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
20510 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
20520 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
20530 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
20540 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
20550 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
20560 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
20570 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
20580 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
20590 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
205a0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
205b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
205c0 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
205d0 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
205e0 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
205f0 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
20600 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
20610 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
20620 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
20630 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
20640 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
20650 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
20660 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
20670 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20680 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
20690 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
206a0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
206b0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
206c0 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
206d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
206e0 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
206f0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
20700 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
20710 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
20720 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
20730 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20740 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
20750 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
20760 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20770 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
20780 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
20790 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
207a0 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  YS(pA->op!=TK_AG
207b0 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d  G_COLUMN) && pA-
207c0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
207d0 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
207e0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
207f0 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
20800 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
20810 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
20820 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
20830 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
20840 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
20850 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
20860 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
20870 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
20880 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
20890 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
208a0 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
208b0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
208c0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
208d0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
208e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
208f0 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
20900 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
20910 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
20920 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20930 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
20940 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
20950 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
20960 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
20970 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
20980 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
20990 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
209a0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
209b0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
209c0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
209d0 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 29 7b  _Reduced)==0) ){
209e0 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
209f0 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
20a00 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
20a10 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54        if( pA->iT
20a20 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
20a30 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d   .       && (pA-
20a40 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
20a50 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c   NEVER(pB->iTabl
20a60 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20  e>=0)) ) return 
20a70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
20a80 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
20a90 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78  * Compare two Ex
20aa0 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20  prList objects. 
20ab0 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
20ac0 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
20ad0 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  and .** non-zero
20ae0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
20af0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
20b00 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
20b10 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
20b20 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
20b30 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
20b40 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
20b50 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
20b60 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
20b70 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
20b80 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
20b90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20ba0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
20bb0 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
20bc0 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
20bd0 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
20be0 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
20bf0 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
20c00 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
20c10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
20c20 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
20c30 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
20c40 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
20c50 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
20c60 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
20c70 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
20c80 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
20c90 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
20ca0 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
20cb0 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
20cc0 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
20cd0 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
20ce0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
20cf0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
20d00 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
20d10 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
20d20 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69   ExprList *pB, i
20d30 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20  nt iTab){.  int 
20d40 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26  i;.  if( pA==0 &
20d50 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  & pB==0 ) return
20d60 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   0;.  if( pA==0 
20d70 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  || pB==0 ) retur
20d80 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e  n 1;.  if( pA->n
20d90 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20  Expr!=pB->nExpr 
20da0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
20db0 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78  r(i=0; i<pA->nEx
20dc0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
20dd0 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d  pr *pExprA = pA-
20de0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
20df0 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20   Expr *pExprB = 
20e00 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pB->a[i].pExpr;.
20e10 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d      if( pA->a[i]
20e20 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e  .sortOrder!=pB->
20e30 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
20e40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
20e50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20e60 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45  mpare(pExprA, pE
20e70 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
20e80 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
20e90 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20ea0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
20eb0 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65  we can prove the
20ec0 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73   pE2 will always
20ed0 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20   be true if pE1 
20ee0 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74  is.** true.  Ret
20ef0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20  urn false if we 
20f00 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  cannot complete 
20f10 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20  the proof or if 
20f20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  pE2 might.** be 
20f30 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73  false.  Examples
20f40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a  :.**.**     pE1:
20f50 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a   x==5       pE2:
20f60 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
20f70 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
20f80 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20  *     pE1: x>0  
20f90 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
20fb0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
20fc0 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20   pE1: x=21      
20fd0 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d   pE2: x=21 OR y=
20fe0 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74  43     Result: t
20ff0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
21000 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20  x!=123     pE2: 
21010 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
21020 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
21030 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20       pE1: x!=?1 
21040 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
21050 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
21060 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
21070 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70  E1: x IS NULL  p
21080 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
21090 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c  L    Result: fal
210a0 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
210b0 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78   IS ?2    pE2: x
210c0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
210d0 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Reuslt: false.**
210e0 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  .** When compari
210f0 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ng TK_COLUMN nod
21100 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61  es between pE1 a
21110 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68  nd pE2, if pE2 h
21120 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c  as.** Expr.iTabl
21130 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20  e<0 then assume 
21140 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67  a table number g
21150 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a  iven by iTab..**
21160 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  .** When in doub
21170 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  t, return false.
21180 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65    Returning true
21190 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
211a0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70  rformance.** imp
211b0 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  rovement.  Retur
211c0 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74  ning false might
211d0 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d   cause a perform
211e0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20  ance reduction, 
211f0 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61  but.** it will a
21200 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63  lways give the c
21210 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e  orrect answer an
21220 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79  d is hence alway
21230 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s safe..*/.int s
21240 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
21250 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c  sExpr(Expr *pE1,
21260 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
21270 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
21280 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
21290 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d  pE1, pE2, iTab)=
212a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
212b0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
212c0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20  2->op==TK_OR.   
212d0 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49  && (sqlite3ExprI
212e0 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
212f0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
21300 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
21310 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
21320 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
21330 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  2->pRight, iTab)
21340 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75   ).  ){.    retu
21350 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
21360 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  pE2->op==TK_NOTN
21370 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ULL.   && sqlite
21380 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
21390 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c  ->pLeft, pE2->pL
213a0 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20  eft, iTab)==0.  
213b0 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b   && (pE1->op!=TK
213c0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
213d0 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a  op!=TK_IS).  ){.
213e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
213f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21400 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
21410 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
21420 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
21430 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
21440 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63  e walker.** to c
21450 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  ount references 
21460 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  to table columns
21470 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
21480 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72  s of an .** aggr
21490 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
214a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c  in order to impl
214b0 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c  ement the.** sql
214c0 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73  ite3FunctionThis
214d0 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  Src() routine..*
214e0 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e  /.struct SrcCoun
214f0 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  t {.  SrcList *p
21500 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61  Src;   /* One pa
21510 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c  rticular FROM cl
21520 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64  ause in a nested
21530 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
21540 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20  nThis;       /* 
21550 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
21560 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
21570 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  in pSrcList */. 
21580 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20   int nOther;    
21590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
215a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
215b0 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52  umns in other FR
215c0 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b  OM clauses */.};
215d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  ../*.** Count th
215e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
215f0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
21600 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
21610 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61   exprSrcCount(Wa
21620 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
21630 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f  xpr *pExpr){.  /
21640 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e  * The NEVER() on
21650 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
21660 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69   is because sqli
21670 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
21680 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73  hisSrc().  ** is
21690 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
216a0 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70  efore sqlite3Exp
216b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
216c0 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a  es() and so the.
216d0 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20    ** TK_COLUMNs 
216e0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
216f0 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  n converted into
21700 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
21710 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   If.  ** sqlite3
21720 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
21730 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69  Src() is used di
21740 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  fferently in the
21750 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a   future, the.  *
21760 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e  * NEVER() will n
21770 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65  eed to be remove
21780 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  d. */.  if( pExp
21790 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
217a0 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d   || NEVER(pExpr-
217b0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
217c0 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  MN) ){.    int i
217d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
217e0 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b  Count *p = pWalk
217f0 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b  er->u.pSrcCount;
21800 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
21810 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
21820 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
21830 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
21840 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
21850 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b  iTable==pSrc->a[
21860 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65  i].iCursor ) bre
21870 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
21880 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  ( i<pSrc->nSrc )
21890 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
218a0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
218b0 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
218c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
218d0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
218e0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
218f0 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
21900 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
21910 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
21920 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
21930 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
21940 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
21950 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
21960 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
21970 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
21980 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
21990 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
219a0 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
219b0 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
219c0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
219d0 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
219e0 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
219f0 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
21a00 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
21a10 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
21a20 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
21a30 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
21a40 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
21a50 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
21a60 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
21a70 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
21a80 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
21a90 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
21aa0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
21ab0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
21ac0 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a  = exprSrcCount;.
21ad0 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
21ae0 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
21af0 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
21b00 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
21b10 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
21b20 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
21b30 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
21b40 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
21b50 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
21b60 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
21b70 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
21b80 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
21b90 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
21ba0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
21bb0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
21bc0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
21bd0 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
21be0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
21bf0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
21c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21c10 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
21c20 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
21c30 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
21c40 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
21c50 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
21c60 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
21c70 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
21c80 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
21c90 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
21ca0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
21cb0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
21cc0 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
21cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
21ce0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
21cf0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
21d00 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
21d10 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
21d20 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
21d30 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
21d40 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
21d50 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
21d60 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
21d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21d80 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
21d90 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
21da0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
21db0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
21dc0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
21dd0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
21de0 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
21df0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
21e00 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
21e10 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
21e20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
21e30 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
21e40 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
21e50 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
21e60 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
21e70 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
21e80 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
21e90 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
21ea0 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
21eb0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
21ec0 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
21ed0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
21ee0 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
21ef0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
21f00 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21f10 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
21f20 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
21f30 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
21f40 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
21f50 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
21f60 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
21f70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
21f80 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
21f90 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21fa0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
21fb0 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
21fc0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
21fd0 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
21fe0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
21ff0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
22000 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
22010 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
22020 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22030 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
22040 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
22050 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
22060 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
22070 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
22080 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
22090 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
220a0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
220b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
220c0 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
220d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
220e0 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
220f0 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
22100 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
22110 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22120 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
22130 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
22140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
22150 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
22160 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
22170 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
22180 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
22190 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
221a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
221b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
221c0 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
221d0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
221e0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
221f0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
22200 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
22210 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
22220 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
22230 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
22240 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
22250 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22260 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
22270 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
22280 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
22290 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
222a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
222b0 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
222c0 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
222d0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
222e0 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
222f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
22300 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
22310 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
22320 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22330 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
22340 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
22350 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
22360 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
22370 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
22380 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
22390 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
223a0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
223b0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
223c0 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
223d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
223e0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
223f0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
22410 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
22420 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22430 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
22440 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
22450 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
22460 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
22470 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
22480 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
22490 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
224a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
224b0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
224c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
224d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
224e0 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
224f0 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
22500 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
22510 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
22520 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
22530 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
22540 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
22550 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
22560 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
22570 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22590 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
225a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
225b0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
225c0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
225d0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
225e0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
225f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22600 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
22610 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
22620 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
22630 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
22660 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
22670 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
22680 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
22690 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
226a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
226b0 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
226c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
226d0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
226e0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
22710 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
22720 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
22730 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
22740 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
22750 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
22760 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22780 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
22790 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
227a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
227b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
227c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
227d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
227e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
227f0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
22800 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
22810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22820 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
22830 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
22840 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
22850 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
22860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22870 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22880 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
22890 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
228a0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
228b0 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
228c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
228d0 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
228e0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
228f0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
22900 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
22910 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
22920 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
22930 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
22940 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
22950 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
22960 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
22970 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
22980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22990 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
229a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
229b0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
229c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
229d0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
229e0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
229f0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
22a00 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
22a10 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
22a20 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
22a30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22a40 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
22a50 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
22a60 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
22a70 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
22a80 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
22a90 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
22aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
22ab0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
22ac0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
22ad0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
22ae0 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
22af0 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
22b00 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
22b10 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
22b20 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
22b30 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
22b40 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
22b50 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
22b60 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
22b70 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
22b80 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
22b90 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
22ba0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
22bb0 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
22bc0 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
22bd0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
22be0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
22bf0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
22c00 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
22c10 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
22c20 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
22c30 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
22c40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
22c50 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
22c60 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
22c70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22ca0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
22cb0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
22cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
22cd0 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
22ce0 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
22cf0 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
22d00 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
22d10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22d20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
22d30 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
22d40 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
22d50 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
22d60 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
22d70 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
22d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22d90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
22da0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
22db0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
22dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
22dd0 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
22de0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
22df0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
22e00 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
22e10 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
22e20 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
22e30 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
22e40 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
22e50 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
22e60 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
22e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
22e80 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
22e90 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
22ea0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
22ed0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
22ee0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
22ef0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
22f00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
22f10 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
22f20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
22f30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
22f40 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
22f50 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
22f60 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
22f70 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
22f80 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
22f90 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
22fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22fb0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
22fc0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
22fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
22fe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
23000 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
23010 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
23020 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
23030 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
23040 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23050 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23060 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23070 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
23080 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
23090 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
230a0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
230b0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
230c0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
230d0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
230e0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
230f0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
23100 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
23110 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65  _Prune;.      }e
23120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
23130 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
23160 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
23170 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
23180 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
23190 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
231a0 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
231b0 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
231c0 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29  RAMETER(pWalker)
231d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
231e0 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
231f0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23200 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  inue;.}../*.** A
23210 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
23220 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
23230 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
23240 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
23250 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
23260 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
23270 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
23280 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
23290 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
232a0 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
232b0 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
232c0 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
232d0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
232e0 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
232f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23300 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
23310 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
23320 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
23330 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
23340 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
23350 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
23360 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23370 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23380 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
23390 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
233a0 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
233b0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
233c0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
233d0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
233e0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
233f0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
23400 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
23410 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
23420 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
23430 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
23440 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
23450 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
23460 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
23470 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
23480 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
23490 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
234a0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
234b0 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
234c0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
234d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
234e0 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
234f0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
23500 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
23510 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
23520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23530 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
23540 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
23550 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
23560 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
23570 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23580 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
23590 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
235a0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
235b0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
235c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
235d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
235e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
235f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
23600 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
23610 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
23620 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
23630 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
23640 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
23650 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
23660 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
23670 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
23680 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
23690 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
236a0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
236b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
236c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
236d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
236e0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
236f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
23700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
23710 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
23720 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
23730 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
23740 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
23750 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
23760 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
23770 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
23780 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
23790 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
237a0 74 68 65 20 64 61 6c 6c 6f 63 61 74 69 6f 6e 20  the dallocation 
237b0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
237c0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
237d0 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
237e0 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
237f0 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
23800 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23810 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
23820 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23830 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
23840 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
23850 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
23860 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
23870 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
23880 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
23890 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
238a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
238b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
238c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
238d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
238e0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
238f0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
23900 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
23910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
23920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23930 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
23940 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
23950 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
23960 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
23970 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
23980 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
23990 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
239a0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
239b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
239c0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
239d0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
239e0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
239f0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
23a00 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
23a10 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
23a20 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
23a30 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
23a40 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
23a50 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
23a60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
23a70 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
23a80 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
23a90 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
23aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
23ab0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
23ac0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
23ad0 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
23ae0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
23af0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23b00 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
23b10 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
23b20 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
23b30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
23b40 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
23b50 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
23b60 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
23b70 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
23b80 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
23b90 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
23ba0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
23bb0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
23bc0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
23bd0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
23be0 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
23bf0 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
23c00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23c10 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
23c20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
23c30 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
23c40 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
23c50 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
23c60 30 3b 0a 7d 0a                                   0;.}.