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

Artifact 4f9e497c66e2f25a4d139357a778c84d5713207c:


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 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2450: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2460: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2470: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2480: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
2490: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
24a0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
24b0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
24c0: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
24d0: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
24e0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
24f0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
2500: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
2510: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
2520: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
2530: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2540: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2550: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2560: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2570: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2580: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
2590: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
25a0: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
25b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
25c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
25d0: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
25e0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
25f0: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
2600: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
2610: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
2620: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2630: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2640: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2650: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2660: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2670: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2680: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
2690: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
26a0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
26b0: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
26c0: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
26d0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
26e0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
26f0: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
2700: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
2710: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
2720: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2730: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2740: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2750: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2760: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2770: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2780: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
2790: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
27a0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
27b0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
27c0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
27d0: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
27e0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
27f0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2800: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2810: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2820: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2830: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2850: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2860: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2870: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2880: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
2890: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28a0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
28b0: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
28c0: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
28d0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
28e0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
28f0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2900: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2910: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2920: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2930: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2940: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2950: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2960: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2970: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2980: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
2990: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
29a0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
29b0: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
29c0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
29d0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
29e0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
29f0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2a00: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2a10: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2a20: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2a30: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2a40: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2a50: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2a60: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2a70: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2a80: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2a90: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2aa0: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
2ab0: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
2ac0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
2ad0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2ae0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2af0: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2b00: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2b10: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2b20: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2b30: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2b40: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2b50: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b60: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2b70: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2b80: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ba0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45   exprSetHeight(E
2bb0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
2bc0: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2bd0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2be0: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
2bf0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c00: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
2c10: 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  ht);.  if( ExprH
2c20: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2c30: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
2c40: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2c50: 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  t(p->x.pSelect, 
2c60: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  &nHeight);.  }el
2c70: 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  se{.    heightOf
2c80: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2c90: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2ca0: 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74    }.  p->nHeight
2cb0: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
2cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2cd0: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
2ce0: 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65  riable using the
2cf0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29   exprSetHeight()
2d00: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a   function. If.**
2d10: 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67   the height is g
2d20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2d30: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  maximum allowed 
2d40: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2d50: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
2d60: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
2d70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
2d80: 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73  prSetHeight(Pars
2d90: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2da0: 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65  *p){.  exprSetHe
2db0: 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  ight(p);.  sqlit
2dc0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
2dd0: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
2de0: 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ight);.}../*.** 
2df0: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  Return the maxim
2e00: 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79  um height of any
2e10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2e20: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62   referenced.** b
2e30: 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  y the select sta
2e40: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
2e50: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
2e60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2e70: 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c  ctExprHeight(Sel
2e80: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ect *p){.  int n
2e90: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
2ea0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20  ightOfSelect(p, 
2eb0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74  &nHeight);.  ret
2ec0: 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23  urn nHeight;.}.#
2ed0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65  else.  #define e
2ee0: 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a  xprSetHeight(y).
2ef0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2f00: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2f10: 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0 */../*.** This
2f20: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2f30: 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66  core allocator f
2f40: 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a  or Expr nodes..*
2f50: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2f60: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2f70: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
2f80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
2f90: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
2fa0: 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f  this node and fo
2fb0: 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67  r the pToken arg
2fc0: 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c  ument is a singl
2fd0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  e allocation.** 
2fe0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2ff0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e  lite3DbMalloc().
3000: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
3010: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
3020: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
3030: 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64  ing sure the nod
3040: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74  e eventually get
3050: 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  s freed..**.** I
3060: 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72 75  f dequote is tru
3070: 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  e, then the toke
3080: 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  n (if it exists)
3090: 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a   is dequoted..**
30a0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 66   If dequote is f
30b0: 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69  alse, no dequoti
30c0: 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e 63  ng is performanc
30d0: 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  e.  The deQuote.
30e0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
30f0: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3100: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3110: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3120: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3130: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3140: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3150: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
3160: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
3170: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
3180: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
3190: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
31a0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
31b0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
31c0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
31d0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
31e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
31f0: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3200: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3210: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3220: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3230: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3240: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3250: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
3260: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
3270: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
3280: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
3290: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
32a0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
32b0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
32c0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
32d0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
32e0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
32f0: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3300: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3310: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3320: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3340: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3350: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
3360: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
3370: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3390: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
33a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
33b0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
33c0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
33d0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
33e0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3400: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3410: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3420: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3430: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3440: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54  e = 0;..  if( pT
3450: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  oken ){.    if( 
3460: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
3470: 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20  | pToken->z==0. 
3480: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
3490: 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b  te3GetInt32(pTok
34a0: 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d  en->z, &iValue)=
34b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  =0 ){.      nExt
34c0: 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31  ra = pToken->n+1
34d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34e0: 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20  iValue>=0 );.   
34f0: 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20   }.  }.  pNew = 
3500: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
3510: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
3520: 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20  xpr)+nExtra);.  
3530: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
3540: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
3550: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67  p;.    pNew->iAg
3560: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  g = -1;.    if( 
3570: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  pToken ){.      
3580: 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b  if( nExtra==0 ){
3590: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
35a0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
35b0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
35c0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56  w->u.iValue = iV
35d0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  alue;.      }els
35e0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  e{.        int c
35f0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
3600: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
3610: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
3620: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
3630: 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f 6b  en->z!=0 || pTok
3640: 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  en->n==0 );.    
3650: 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
3660: 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  n ) memcpy(pNew-
3670: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65  >u.zToken, pToke
3680: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
3690: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
36a0: 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d  u.zToken[pToken-
36b0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  >n] = 0;.       
36c0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
36d0: 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20  nExtra>=3 .     
36e0: 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d          && ((c =
36f0: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d   pToken->z[0])==
3700: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c  '\'' || c=='"' |
3710: 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27  | c=='[' || c=='
3720: 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  `') ){.         
3730: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3740: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  pNew->u.zToken);
3750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
3760: 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c  =='"' ) pNew->fl
3770: 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f  ags |= EP_DblQuo
3780: 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ted;.        }. 
3790: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
37a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
37b0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65  _DEPTH>0.    pNe
37c0: 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a  w->nHeight = 1;.
37d0: 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72  #endif  .  }.  r
37e0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
37f0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3800: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
3810: 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  ode from a zero-
3820: 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e  terminated token
3830: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72   that has.** alr
3840: 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74  eady been dequot
3850: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
3860: 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69  ite3Expr(.  sqli
3870: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3880: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
3890: 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  r sqlite3DbMallo
38a0: 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20  cZero() (may be 
38b0: 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  null) */.  int o
38c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
38d0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
38e0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
38f0: 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20  st char *zToken 
3900: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72       /* Token ar
3910: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
3920: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
3930: 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20  oken x;.  x.z = 
3940: 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20  zToken;.  x.n = 
3950: 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33  zToken ? sqlite3
3960: 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29  Strlen30(zToken)
3970: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73   : 0;.  return s
3980: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
3990: 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a  db, op, &x, 0);.
39a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
39b0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
39c0: 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65  nd pRight to the
39d0: 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74   Expr node pRoot
39e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74  ..**.** If pRoot
39f0: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
3a00: 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20  s that a memory 
3a10: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
3a20: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a   has occurred..*
3a30: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
3a40: 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72  delete the subtr
3a50: 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ees pLeft and pR
3a60: 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ight..*/.void sq
3a70: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
3a80: 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74  ubtrees(.  sqlit
3a90: 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a  e3 *db,.  Expr *
3aa0: 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70  pRoot,.  Expr *p
3ab0: 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52  Left,.  Expr *pR
3ac0: 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52  ight.){.  if( pR
3ad0: 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  oot==0 ){.    as
3ae0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
3af0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71  Failed );.    sq
3b00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3b10: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3b20: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3b30: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3b50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
3b60: 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20  pRoot->pRight = 
3b70: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 52  pRight;.      pR
3b80: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
3b90: 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67 68  _Collate & pRigh
3ba0: 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  t->flags;.    }.
3bb0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b      if( pLeft ){
3bc0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c  .      pRoot->pL
3bd0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  eft = pLeft;.   
3be0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
3bf0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20  |= EP_Collate & 
3c00: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  pLeft->flags;.  
3c10: 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74 48    }.    exprSetH
3c20: 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20  eight(pRoot);.  
3c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
3c40: 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64 65 20  ate a Expr node 
3c50: 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d  which joins as m
3c60: 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62 74 72  any as two subtr
3c70: 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f  ees..**.** One o
3c80: 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75  r both of the su
3c90: 62 74 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55  btrees can be NU
3ca0: 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  LL.  Return a po
3cb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
3cc0: 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20  .** Expr node.  
3cd0: 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  Or, if an OOM er
3ce0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
3cf0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
3d00: 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65  ocFailed,.** fre
3d10: 65 20 74 68 65 20 73 75 62 74 72 65 65 73 20 61  e the subtrees a
3d20: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
3d30: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3d40: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
3d50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3d60: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3d70: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3da0: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
3db0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
3dc0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
3dd0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
3de0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3df0: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3e00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3e10: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3e20: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3e30: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b  */.){.  Expr *p;
3e40: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e  .  if( op==TK_AN
3e50: 44 20 26 26 20 70 4c 65 66 74 20 26 26 20 70 52  D && pLeft && pR
3e60: 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ight ){.    /* T
3e70: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
3e80: 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66   short-circuit f
3e90: 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alse optimizatio
3ea0: 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20  n for AND */.   
3eb0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
3ec0: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3ed0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
3ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
3ef0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3f00: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  c(pParse->db, op
3f10: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
3f20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
3f30: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
3f40: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
3f50: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  , pRight);.  }. 
3f60: 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73   if( p ) {.    s
3f70: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
3f80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
3f90: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20  >nHeight);.  }. 
3fa0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3fb0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
3fc0: 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ssion is always 
3fd0: 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46  either TRUE or F
3fe0: 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65  ALSE (respective
3ff0: 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ly),.** then ret
4000: 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63  urn 1.  If one c
4010: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
4020: 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20  the truth value 
4030: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
4040: 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d  sion at compile-
4050: 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  time return 0..*
4060: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
4070: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
4080: 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72  f is OK to retur
4090: 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66  n 0 here even if
40a0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
40b0: 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77  on really is alw
40c0: 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c  ays false or fal
40d0: 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61  se (a false nega
40e0: 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74  tive)..** But it
40f0: 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74   is a bug to ret
4100: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
4110: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61  ression might ha
4120: 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
4130: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69  boolean values i
4140: 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63  n different circ
4150: 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c  umstances (a fal
4160: 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a  se positive.).**
4170: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
4180: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4190: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69  is part of condi
41a0: 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20  tional for a.** 
41b0: 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
41c0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
41d0: 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ine at compile-t
41e0: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
41f0: 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65  ot.** is it true
4200: 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c   or false, so al
4210: 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ways return 0..*
4220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
4230: 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72  rAlwaysTrue(Expr
4240: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
4250: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
4260: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
4270: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
4280: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
4290: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
42a0: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
42b0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d   0;.  return v!=
42c0: 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  0;.}.static int 
42d0: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
42e0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
42f0: 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70  v = 0;.  if( Exp
4300: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4310: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
4320: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
4330: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
4340: 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65  eger(p, &v) ) re
4350: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4360: 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   v==0;.}../*.** 
4370: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
4380: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
4390: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
43a0: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
43b0: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
43c0: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
43d0: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
43e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ion..**.** If on
43f0: 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74  e side or the ot
4400: 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69  her of the AND i
4410: 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61  s known to be fa
4420: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
4430: 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e  d.** of returnin
4440: 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73  g an AND express
4450: 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ion, just return
4460: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
4470: 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61  ession with.** a
4480: 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e   value of false.
4490: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
44a0: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
44b0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
44c0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
44d0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
44e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
44f0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
4500: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
4510: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
4520: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78  ;.  }else if( ex
4530: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c  prAlwaysFalse(pL
4540: 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61  eft) || exprAlwa
4550: 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20  ysFalse(pRight) 
4560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4570: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4580: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4590: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
45a0: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
45b0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
45c0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
45d0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
45e0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20  okens[0], 0);.  
45f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20  }else{.    Expr 
4600: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
4610: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
4620: 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AND, 0, 0);.    
4630: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
4640: 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e  hSubtrees(db, pN
4650: 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ew, pLeft, pRigh
4660: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  t);.    return p
4670: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
4680: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
4690: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
46a0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
46b0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
46c0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
46d0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
46e0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
46f0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
4700: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
4710: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
4720: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
4730: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4740: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
4750: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
4760: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4770: 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f  c(db, TK_FUNCTIO
4780: 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  N, pToken, 1);. 
4790: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
47a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
47b0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
47c0: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d  ist); /* Avoid m
47d0: 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20  emory leak when 
47e0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
47f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4800: 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73  }.  pNew->x.pLis
4810: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
4820: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
4830: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78  perty(pNew, EP_x
4840: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73  IsSelect) );.  s
4850: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
4860: 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ght(pParse, pNew
4870: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
4880: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
4890: 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  n a variable num
48a0: 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ber to an expres
48b0: 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65  sion that encode
48c0: 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20  s a wildcard.** 
48d0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
48e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
48f0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4900: 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
4910: 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20   single "?" are 
4920: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78  assigned the nex
4930: 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20  t sequential.** 
4940: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e  variable number.
4950: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
4960: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4970: 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  nn" are assigned
4980: 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e   the number "nnn
4990: 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73  ".  We make.** s
49a0: 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74  ure "nnn" is not
49b0: 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64   too be to avoid
49c0: 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72   a denial of ser
49d0: 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e  vice attack when
49e0: 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74  .** the SQL stat
49f0: 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d  ement comes from
4a00: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75   an external sou
4a10: 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  rce..**.** Wildc
4a20: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
4a30: 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22 2c   ":aaa", "@aaa",
4a40: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4a50: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4a60: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4a70: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4a80: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4a90: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
4aa0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
4ab0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
4ac0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
4ad0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
4ae0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
4af0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
4b00: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4b10: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
4b20: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
4b30: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
4b40: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4b50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4b60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4b70: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4b80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4b90: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4ba0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
4bb0: 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64 75 63  ntValue|EP_Reduc
4bc0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
4bd0: 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70 72 2d   );.  z = pExpr-
4be0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61 73 73  >u.zToken;.  ass
4bf0: 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 61  ert( z!=0 );.  a
4c00: 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30 20 29  ssert( z[0]!=0 )
4c10: 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 30 20  ;.  if( z[1]==0 
4c20: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
4c30: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4c40: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
4c50: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
4c60: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  mber */.    asse
4c70: 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 3b  rt( z[0]=='?' );
4c80: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
4c90: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b  umn = (ynVar)(++
4ca0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20  pParse->nVar);. 
4cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e 56 61   }else{.    ynVa
4cc0: 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75 33 32  r x = 0;.    u32
4cd0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
4ce0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28  en30(z);.    if(
4cf0: 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20   z[0]=='?' ){.  
4d00: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
4d10: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
4d20: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
4d30: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
4d40: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 73   and.      ** us
4d50: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
4d60: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
4d70: 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20 20 20       i64 i;.    
4d80: 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d 3d 73    int bOk = 0==s
4d90: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26 7a 5b  qlite3Atoi64(&z[
4da0: 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53 51 4c  1], &i, n-1, SQL
4db0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
4dc0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4dd0: 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69 3b 0a  = x = (ynVar)i;.
4de0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4df0: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  i==0 );.      te
4e00: 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a  stcase( i==1 );.
4e10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4e20: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
4e30: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4e40: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
4e50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4e60: 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53   i==db->aLimit[S
4e70: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4e80: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a  ABLE_NUMBER] );.
4e90: 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30        if( bOk==0
4ea0: 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d   || i<1 || i>db-
4eb0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4ec0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4ed0: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 20  MBER] ){.       
4ee0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4ef0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
4f00: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
4f10: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
4f20: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
4f30: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51     db->aLimit[SQ
4f40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
4f50: 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20  BLE_NUMBER]);.  
4f60: 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20        x = 0;.   
4f70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4f80: 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b  >pParse->nVar ){
4f90: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
4fa0: 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69 3b 0a  >nVar = (int)i;.
4fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4fc0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  e{.      /* Wild
4fd0: 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61  cards like ":aaa
4fe0: 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22 40 61  ", "$aaa" or "@a
4ff0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
5000: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
5010: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73      ** number as
5020: 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61   the prior appea
5030: 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  rance of the sam
5040: 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68  e name, or if th
5050: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e name.      ** 
5060: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
5070: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
5080: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
5090: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  le number.      
50a0: 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72 20 69  */.      ynVar i
50b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
50c0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   i<pParse->nzVar
50d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
50e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  if( pParse->azVa
50f0: 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 70  r[i] && strcmp(p
5100: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 2c  Parse->azVar[i],
5110: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
5120: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5130: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5140: 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  +1;.          br
5150: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5170: 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45 78 70   x==0 ) x = pExp
5180: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5190: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
51a0: 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Var);.    }.    
51b0: 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20 20 20  if( x>0 ){.     
51c0: 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d 3e 6e   if( x>pParse->n
51d0: 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zVar ){.        
51e0: 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20 20 20  char **a;.      
51f0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
5200: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61 72 73  ealloc(db, pPars
5210: 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69 7a 65  e->azVar, x*size
5220: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
5230: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65     if( a==0 ) re
5240: 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f 72 20  turn;  /* Error 
5250: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
5260: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5270: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61  d */.        pPa
5280: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
5290: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
52a0: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
52b0: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
52c0: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
52d0: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
52e0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
52f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5300: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
5310: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5320: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
5330: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5340: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
5350: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
5360: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5370: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
5380: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
5390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
53a0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
53b0: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
53c0: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
53d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
53e0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
53f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5400: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5410: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
5420: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
5430: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
5440: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
5450: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
5460: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5470: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
5480: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
5490: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
54a0: 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79  urn;.  /* Sanity
54b0: 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74   check: Assert t
54c0: 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65  hat the IntValue
54d0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
54e0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
54f0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5500: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5510: 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70  P_IntValue) || p
5520: 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b  ->u.iValue>=0 );
5530: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
5540: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
5550: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
5560: 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e  /* The Expr.x un
5570: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65  ion is never use
5580: 64 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  d at the same ti
5590: 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68  me as Expr.pRigh
55a0: 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
55b0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
55c0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
55d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
55e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
55f0: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
5600: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5610: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
5620: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5630: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
5640: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
5650: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
5660: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45  oken);.    if( E
5670: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5680: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5690: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
56a0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
56b0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
56c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
56e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
56f0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
5700: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
5710: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
5720: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
5730: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5740: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
5750: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5760: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
5770: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
5780: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
5790: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
57a0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
57b0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
57c0: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
57d0: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
57e0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
57f0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5800: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
5810: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
5820: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
5830: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5840: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
5850: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
5860: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
5870: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5880: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
5890: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
58a0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
58b0: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
58c0: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
58d0: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
58e0: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
58f0: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
5900: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5910: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
5920: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
5930: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
5940: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5950: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
5960: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
5970: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
5980: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
5990: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
59a0: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
59b0: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
59c0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
59d0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
59e0: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
59f0: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
5a00: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
5a10: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
5a20: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
5a30: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
5a40: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5aa0: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5ab0: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5ac0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5ad0: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
5ae0: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5af0: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5b00: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5b10: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
5b20: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
5b30: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
5b40: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
5b50: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
5b60: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
5b70: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
5b80: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5b90: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5ba0: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5bb0: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5bc0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5bd0: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5be0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5bf0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5c00: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5c10: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
5c20: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
5c30: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
5c40: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
5c50: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
5c60: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
5c70: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
5c80: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5c90: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5ca0: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5cb0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5cc0: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5cd0: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5ce0: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5cf0: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5d00: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5d10: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
5d20: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
5d30: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
5d40: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
5d50: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
5d60: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
5d70: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
5d80: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5d90: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5da0: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5db0: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5dc0: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5dd0: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5de0: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5df0: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5e00: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5e10: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
5e20: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
5e30: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
5e40: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
5e50: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
5e60: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
5e70: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
5e80: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5e90: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5ea0: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5eb0: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5ec0: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5ed0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5ee0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5ef0: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5f00: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5f10: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5f20: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
5f30: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
5f40: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
5f50: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5f60: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5f70: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
5f80: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5f90: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5fa0: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5fb0: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5fc0: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5fd0: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61  e allowed */.  a
5fe0: 73 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c  ssert( EXPR_FULL
5ff0: 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20  SIZE<=0xfff );. 
6000: 20 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20   assert( (0xfff 
6010: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
6020: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
6030: 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61  );.  if( 0==(fla
6040: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6050: 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  E) ){.    nSize 
6060: 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  = EXPR_FULLSIZE;
6070: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6080: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
6090: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
60a0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
60b0: 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  d) );.    assert
60c0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
60d0: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
60e0: 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72  n) ); .    asser
60f0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6100: 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b  rty(p, EP_MemTok
6110: 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  en) );.    asser
6120: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6130: 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75  rty(p, EP_NoRedu
6140: 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ce) );.    if( p
6150: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e  ->pLeft || p->x.
6160: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
6170: 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55  Size = EXPR_REDU
6180: 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64  CEDSIZE | EP_Red
6190: 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  uced;.    }else{
61a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
61b0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
61c0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
61d0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
61e0: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  | EP_TokenOnly;.
61f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6200: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
6210: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6220: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61   returns the spa
6230: 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75  ce in bytes requ
6240: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
6250: 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68  e copy .** of th
6260: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
6270: 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74   and a copy of t
6280: 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  he Expr.u.zToken
6290: 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74   string (if that
62a0: 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65  .** string is de
62b0: 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  fined.).*/.stati
62c0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e  c int dupedExprN
62d0: 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  odeSize(Expr *p,
62e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
62f0: 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64  nt nByte = duped
6300: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
6310: 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66  , flags) & 0xfff
6320: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
6330: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
6340: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
6350: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e  .zToken ){.    n
6360: 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
6370: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
6380: 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65  ken)+1;.  }.  re
6390: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
63a0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
63b0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
63c0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
63d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
63e0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
63f0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
6400: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
6410: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
6420: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6430: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
6440: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
6450: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
6460: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
6470: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
6480: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
6490: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
64a0: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
64b0: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
64c0: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
64d0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20  pr.u.zToken, if 
64e0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  any..**.** If th
64f0: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
6500: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
6510: 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
6520: 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a  lue includes .**
6530: 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63   space to duplic
6540: 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64  ate all Expr nod
6550: 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66  es in the tree f
6560: 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c  ormed by Expr.pL
6570: 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72  eft .** and Expr
6580: 2e 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65  .pRight variable
6590: 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61  s (but not for a
65a0: 6e 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f  ny structures po
65b0: 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20  inted to or .** 
65c0: 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74  descended from t
65d0: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
65e0: 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63  or Expr.x.pSelec
65f0: 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f  t variables)..*/
6600: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
6610: 64 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a  dExprSize(Expr *
6620: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
6630: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a   int nByte = 0;.
6640: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e    if( p ){.    n
6650: 42 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72  Byte = dupedExpr
6660: 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67  NodeSize(p, flag
6670: 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  s);.    if( flag
6680: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
6690: 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20   ){.      nByte 
66a0: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
66b0: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73  (p->pLeft, flags
66c0: 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a  ) + dupedExprSiz
66d0: 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61  e(p->pRight, fla
66e0: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
66f0: 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d   return nByte;.}
6700: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
6710: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
6720: 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44   to sqlite3ExprD
6730: 75 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  up(), except tha
6740: 74 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a  t if pzBuffer .*
6750: 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  * is not NULL th
6760: 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20  en *pzBuffer is 
6770: 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
6780: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72   to a buffer lar
6790: 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f  ge enough .** to
67a0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
67b0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c  of expression p,
67c0: 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70   the copies of p
67d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69  ->u.zToken.** (i
67e0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61  f applicable), a
67f0: 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  nd the copies of
6800: 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e   the p->pLeft an
6810: 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72  d p->pRight expr
6820: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61  essions,.** if a
6830: 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72  ny. Before retur
6840: 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20  ning, *pzBuffer 
6850: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69  is set to the fi
6860: 72 73 74 20 62 79 74 65 20 70 61 73 73 65 64 20  rst byte passed 
6870: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
6880: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
6890: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
68a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
68b0: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
68c0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
68d0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
68e0: 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66 65  gs, u8 **pzBuffe
68f0: 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  r){.  Expr *pNew
6900: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
6920: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
6930: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6940: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
6950: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
6960: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
6970: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
6980: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
6990: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
69a0: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
69b0: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
69c0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
69d0: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
69e0: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
69f0: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
6a00: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6a10: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
6a20: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
6a30: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
6a40: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
6a50: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
6a60: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6a70: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
6a80: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
6a90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
6aa0: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
6ab0: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
6ac0: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
6ad0: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
6ae0: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
6af0: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
6b00: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
6b10: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
6b20: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
6b30: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
6b40: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
6b50: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
6b60: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
6b70: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
6b80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
6b90: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
6ba0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
6bb0: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
6bc0: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6bd0: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
6be0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
6bf0: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
6c00: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
6c10: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
6c20: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
6c30: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
6c40: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
6c50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
6c60: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
6c70: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6c80: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
6c90: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
6ca0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6cb0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6cc0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
6cd0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
6ce0: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
6cf0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6d00: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
6d10: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6d20: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
6d30: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
6d40: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
6d50: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
6d60: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
6d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d80: 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78    int nSize = ex
6d90: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
6da0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6db0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
6dc0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
6dd0: 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d  t(&zAlloc[nSize]
6de0: 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49  , 0, EXPR_FULLSI
6df0: 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  ZE-nSize);.     
6e00: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
6e10: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
6e20: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
6e30: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
6e40: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
6e50: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
6e60: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
6e70: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6e80: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
6e90: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
6ea0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6eb0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
6ec0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6ed0: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  kenOnly);.      
6ee0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
6ef0: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
6f00: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
6f10: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
6f20: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
6f30: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
6f40: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
6f50: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
6f60: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
6f70: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
6f80: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
6f90: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
6fa0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
6fb0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
6fc0: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
6fd0: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
6fe0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
6ff0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  .        /* Fill
7000: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
7010: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
7020: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
7030: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7040: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7050: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
7060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7070: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
7080: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7090: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
70a0: 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20  t, isReduced);. 
70b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
70c0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
70d0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
70e0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
70f0: 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64  ->x.pList, isRed
7100: 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  uced);.        }
7110: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7120: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
7130: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
7140: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
7150: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7160: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
7170: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7180: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7190: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
71a0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
71b0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
71c0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
71d0: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
71e0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
71f0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
7200: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7210: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
7220: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7230: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7240: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
7250: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
7260: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
7270: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
7280: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7290: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
72a0: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
72b0: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
72c0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
72d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
72e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
72f0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
7300: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
7310: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7320: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7330: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7340: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
7350: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7360: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
7380: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
7390: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
73a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
73b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
73c0: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
73d0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
73e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
73f0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
7400: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
7410: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
7420: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
7430: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
7440: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
7450: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
7460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7470: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
7480: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
7490: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
74a0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
74b0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
74c0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
74d0: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
74e0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
74f0: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
7500: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7510: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
7520: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
7530: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7540: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
7550: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
7560: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
7570: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
7580: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
7590: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
75a0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
75b0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
75c0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
75d0: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
75e0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
75f0: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
7600: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7610: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
7620: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7630: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
7640: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7650: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7660: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
7670: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
7680: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
7690: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
76a0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
76b0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
76c0: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
76d0: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
76e0: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
76f0: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
7700: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
7710: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
7720: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
7730: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
7740: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
7750: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
7760: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
7770: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
7780: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
7790: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
77a0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
77b0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
77c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
77d0: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
77e0: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
77f0: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
7800: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
7810: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
7820: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
7830: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
7840: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
7850: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
7860: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
7870: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
7880: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
7890: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
78a0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
78b0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
78c0: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
78d0: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
78e0: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
78f0: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
7900: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
7910: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
7920: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
7930: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
7940: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
7950: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
7960: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
7970: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
7980: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
7990: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
79a0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
79b0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
79c0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
79d0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
79e0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
79f0: 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  s){.  return exp
7a00: 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67  rDup(db, p, flag
7a10: 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73  s, 0);.}.ExprLis
7a20: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
7a30: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
7a40: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
7a50: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
7a60: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
7a70: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7a80: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
7a90: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
7aa0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7ab0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
7ac0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7ad0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
7ae0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
7af0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7b00: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
7b10: 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b   = i = p->nExpr;
7b20: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
7b30: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d  EXPRDUP_REDUCE)=
7b40: 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c  =0 ) for(i=1; i<
7b50: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b  p->nExpr; i+=i){
7b60: 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  }.  pNew->a = pI
7b70: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
7b80: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 69 2a  allocRaw(db,  i*
7b90: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
7ba0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
7bb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7bc0: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
7bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7be0: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
7bf0: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
7c00: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
7c10: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
7c20: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
7c30: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
7c40: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
7c50: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
7c60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7c70: 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20  p(db, pOldExpr, 
7c80: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65  flags);.    pIte
7c90: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
7ca0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
7cb0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
7cc0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
7cd0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
7ce0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7cf0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
7d00: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
7d10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
7d20: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
7d30: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  >done = 0;.    p
7d40: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
7d50: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70   = pOldItem->bSp
7d60: 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74  anIsTab;.    pIt
7d70: 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d  em->u = pOldItem
7d80: 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ->u;.  }.  retur
7d90: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7da0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
7db0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
7dc0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
7dd0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
7de0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
7df0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7e00: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
7e10: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
7e20: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
7e30: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
7e40: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
7e50: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
7e60: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7e70: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7e80: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
7e90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7ea0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7eb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7ec0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
7ed0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7ee0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
7ef0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7f00: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
7f10: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
7f20: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7f30: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
7f40: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
7f50: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
7f60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7f70: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7f80: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
7f90: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
7fa0: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
7fb0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
7fc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
7fd0: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
7fe0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
7ff0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
8000: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
8010: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
8020: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
8030: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
8040: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
8050: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
8060: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
8070: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
8080: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
8090: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
80a0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
80b0: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
80c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
80d0: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
80e0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
80f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8100: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
8110: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
8120: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
8130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8140: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
8150: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
8160: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
8170: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
8180: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
8190: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
81a0: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
81b0: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
81c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
81d0: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
81e0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
81f0: 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  NewItem->addrFil
8200: 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  lSub = pOldItem-
8210: 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20  >addrFillSub;.  
8220: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52    pNewItem->regR
8230: 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d  eturn = pOldItem
8240: 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20  ->regReturn;.   
8250: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43 6f 72   pNewItem->isCor
8260: 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  related = pOldIt
8270: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
8280: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8290: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 70  viaCoroutine = p
82a0: 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  OldItem->viaCoro
82b0: 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65 77 49  utine;.    pNewI
82c0: 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65  tem->isRecursive
82d0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 52   = pOldItem->isR
82e0: 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 70 4e  ecursive;.    pN
82f0: 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d  ewItem->zIndex =
8300: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8310: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8320: 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77  Index);.    pNew
8330: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
8340: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74   = pOldItem->not
8350: 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65  Indexed;.    pNe
8360: 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  wItem->pIndex = 
8370: 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78  pOldItem->pIndex
8380: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  ;.    pTab = pNe
8390: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
83a0: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
83b0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
83c0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
83d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
83e0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
83f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8400: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
8410: 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a  Select, flags);.
8420: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
8430: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
8440: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8450: 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20  >pOn, flags);.  
8460: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
8470: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
8480: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
8490: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
84a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
84b0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
84c0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
84d0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
84e0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
84f0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
8500: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
8510: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
8520: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
8530: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8540: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8550: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8560: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
8570: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
8580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8590: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
85a0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
85b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
85c0: 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  b, p->nId*sizeof
85d0: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
85e0: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
85f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8600: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
8610: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8620: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62    /* Note that b
8630: 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20  ecause the size 
8640: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
8650: 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20  n for p->a[] is 
8660: 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
8670: 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20  rily a power of 
8680: 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69  two, sqlite3IdLi
8690: 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e  stAppend() may n
86a0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a  ot be called.  *
86b0: 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61  * on the duplica
86c0: 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  te created by th
86d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  is function. */.
86e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
86f0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
8700: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
8710: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
8720: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
8730: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
8740: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
8750: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
8760: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
8770: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8780: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
8790: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
87a0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
87b0: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
87c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
87d0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
87e0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
87f0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
8800: 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63   flags){.  Selec
8810: 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72  t *pNew, *pPrior
8820: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8830: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8840: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8850: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8860: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
8870: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
8880: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
8890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
88a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
88b0: 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  st, flags);.  pN
88c0: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
88d0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
88e0: 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29   p->pSrc, flags)
88f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
8900: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8910: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
8920: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8930: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
8940: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
8950: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
8960: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8970: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
8980: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
8990: 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b  pHaving, flags);
89a0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
89b0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
89c0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
89d0: 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a  rderBy, flags);.
89e0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
89f0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
8a00: 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71  or = pPrior = sq
8a10: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
8a20: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
8a30: 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ags);.  if( pPri
8a40: 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
8a50: 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
8a60: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
8a70: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pNew->pLimit = s
8a80: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8a90: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61  , p->pLimit, fla
8aa0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  gs);.  pNew->pOf
8ab0: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
8ac0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66  prDup(db, p->pOf
8ad0: 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  fset, flags);.  
8ae0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
8af0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
8b00: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  t = 0;.  pNew->s
8b10: 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
8b20: 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73  Flags & ~SF_Uses
8b30: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65  Ephemeral;.  pNe
8b40: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8b50: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
8b60: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
8b70: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e   = -1;.  pNew->n
8b80: 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e  SelectRow = p->n
8b90: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65  SelectRow;.  pNe
8ba0: 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44  w->pWith = withD
8bb0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29  up(db, p->pWith)
8bc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
8bd0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
8be0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
8bf0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
8c00: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
8c10: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
8c20: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
8c30: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
8c40: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
8c50: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
8c60: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
8c70: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
8c80: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
8c90: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
8ca0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
8cb0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
8cc0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
8cd0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
8ce0: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
8cf0: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
8d00: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
8d10: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
8d20: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
8d30: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
8d40: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
8d50: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
8d60: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
8d70: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
8d80: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
8d90: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
8da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8db0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8dc0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8dd0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
8df0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
8e00: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
8e10: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
8e20: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
8e30: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
8e40: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
8e50: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
8e60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8e70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8e80: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8e90: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
8ea0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8eb0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
8ec0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
8ed0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
8ee0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
8ef0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
8f00: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8f10: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8f20: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
8f30: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
8f40: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
8f50: 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  m;.  }else if( (
8f60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28  pList->nExpr & (
8f70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29  pList->nExpr-1))
8f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
8f90: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8fa0: 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *a;.    assert( 
8fb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
8fc0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
8fd0: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
8fe0: 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
8ff0: 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70  nExpr*2*sizeof(p
9000: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
9010: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
9020: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
9030: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
9040: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61  ->a = a;.  }.  a
9050: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
9060: 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b  =0 );.  if( 1 ){
9070: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
9080: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9090: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
90a0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
90b0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
90c0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
90d0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  ));.    pItem->p
90e0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
90f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
9100: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
9110: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
9120: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
9130: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
9140: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
9150: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
9160: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
9170: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
9180: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
9190: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
91a0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
91b0: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
91c0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
91d0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
91e0: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
91f0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9200: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
9210: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
9220: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
9230: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
9240: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
9250: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9260: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
9270: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
9280: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
9290: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
92a0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
92b0: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
92c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
92d0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
92e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
92f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9300: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
9310: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
9320: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
9330: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
9340: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
9350: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
9360: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
9370: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
9380: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
9390: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
93a0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
93b0: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
93c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
93d0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
93e0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
93f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9400: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
9410: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
9420: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
9430: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9440: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
9450: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
9460: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
9470: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
9480: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9490: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
94a0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
94b0: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
94c0: 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61  te && pItem->zNa
94d0: 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  me ) sqlite3Dequ
94e0: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
94f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9500: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
9510: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
9520: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
9530: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
9540: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
9550: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
9560: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
9570: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
9580: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
9590: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
95a0: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
95b0: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
95c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
95d0: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
95e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
95f0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
9600: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9610: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
9620: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9640: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9650: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9660: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
9670: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
9680: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
9690: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
96a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
96b0: 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64  span to be added
96c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
96d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
96e0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  b;.  assert( pLi
96f0: 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  st!=0 || db->mal
9700: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
9710: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
9720: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
9730: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
9740: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
9750: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
9760: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
9770: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73  Expr>0 );.    as
9780: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
9790: 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d  Failed || pItem-
97a0: 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70  >pExpr==pSpan->p
97b0: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
97c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
97d0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
97e0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
97f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9800: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9810: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9840: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
9850: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
9860: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
9870: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
9880: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
9890: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
98a0: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
98b0: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
98c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
98d0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
98e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
98f0: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
9900: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
9910: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
9920: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9930: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
9940: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
9950: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
9960: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
9970: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
9980: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
9990: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
99a0: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
99b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
99c0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
99d0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
99e0: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
99f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9a00: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
9a10: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
9a20: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
9a30: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
9a40: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
9a50: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
9a60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9a70: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
9a80: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
9a90: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
9aa0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9ab0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9ac0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
9ad0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
9ae0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
9af0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
9b00: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
9b10: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
9b20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
9b30: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
9b40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9b50: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
9b60: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
9b70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
9b80: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
9b90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9ba0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
9bb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
9bc0: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
9bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
9be0: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
9bf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
9c00: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
9c10: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
9c20: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
9c30: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
9c40: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
9c50: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
9c60: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
9c70: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
9c80: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
9c90: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
9ca0: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
9cb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
9cc0: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
9cd0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
9ce0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
9cf0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
9d00: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
9d10: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
9d20: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9d30: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
9d40: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9d50: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
9d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
9d70: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9d80: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
9d90: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
9da0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
9db0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
9dc0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
9dd0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
9de0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
9df0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9e00: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
9e10: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
9e20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
9e30: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
9e40: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
9e50: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
9e60: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
9e70: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
9e80: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
9e90: 3d 33 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =3 && ExprHasPro
9ea0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9eb0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
9ec0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
9ed0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
9ee0: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
9ef0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
9f00: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
9f10: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
9f20: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
9f30: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
9f40: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
9f50: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74  t.    ** and eit
9f60: 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  her pWalker->u.i
9f70: 3d 3d 32 20 6f 72 20 74 68 65 20 66 75 6e 63 74  ==2 or the funct
9f80: 69 6f 6e 20 61 73 20 74 68 65 20 53 51 4c 49 54  ion as the SQLIT
9f90: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 0a 20 20 20  E_FUNC_CONST.   
9fa0: 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20   ** flag. */.   
9fb0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
9fc0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
9fd0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 7c 7c 20  lker->u.i==2 || 
9fe0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9ff0: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 61 6e  pExpr,EP_Constan
a000: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
a010: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
a020: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
a030: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
a040: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
a050: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
a060: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
a070: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
a080: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
a090: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
a0a0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a0b0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
a0c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a0d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
a0e0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
a0f0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a100: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
a110: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a120: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
a130: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
a140: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
a150: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
a160: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
a170: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a180: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
a190: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
a1a0: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
a1b0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
a1c0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
a1d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a1e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
a1f0: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
a200: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
a210: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
a220: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
a230: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
a240: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
a250: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
a260: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
a270: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
a280: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
a290: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
a2a0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
a2b0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
a2c0: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
a2d0: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
a2e0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
a2f0: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
a300: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
a310: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
a320: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
a330: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
a340: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
a350: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
a360: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
a370: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
a380: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
a390: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
a3a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
a3b0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
a3c0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
a3d0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
a3e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a3f0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
a400: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
a410: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
a420: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
a430: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
a440: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
a450: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
a460: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
a470: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
a480: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
a490: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
a4a0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
a4b0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
a4c0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
a4d0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
a4e0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
a4f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
a500: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
a510: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
a520: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
a530: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
a540: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
a550: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
a560: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
a570: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
a580: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
a590: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
a5a0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
a5b0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
a5c0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
a5d0: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
a5e0: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
a5f0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
a600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a610: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
a620: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
a630: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
a640: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
a650: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
a660: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
a670: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
a680: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
a690: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
a6a0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
a6b0: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
a6c0: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
a6d0: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
a6e0: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
a6f0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
a700: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
a710: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
a720: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a730: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
a740: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
a750: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
a760: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
a770: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
a780: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
a790: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a7a0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a7b0: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
a7c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a7d0: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
a7e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
a7f0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
a800: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
a810: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
a820: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
a830: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
a840: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
a850: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
a860: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
a870: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
a880: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
a890: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
a8a0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
a8b0: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
a8c0: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
a8d0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
a8e0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
a8f0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
a900: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
a910: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
a920: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
a930: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
a940: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
a950: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
a960: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
a970: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
a980: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
a990: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
a9a0: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
a9b0: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
a9c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
a9d0: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
a9e0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
a9f0: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
aa00: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
aa10: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
aa20: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
aa30: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
aa40: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
aa50: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
aa60: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
aa70: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
aa80: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
aa90: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
aaa0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
aab0: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
aac0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
aad0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
aae0: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
aaf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ab00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ab10: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
ab20: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
ab30: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
ab40: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
ab50: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
ab60: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
ab70: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
ab80: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
ab90: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
aba0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
abb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
abc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
abd0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
abe0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
abf0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
ac00: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
ac10: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
ac20: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
ac30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
ac40: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
ac50: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
ac60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
ac70: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
ac80: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
ac90: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
aca0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
acb0: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
acc0: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
acd0: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
ace0: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
acf0: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
ad00: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
ad10: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
ad20: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
ad30: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
ad40: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
ad50: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
ad60: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
ad70: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
ad80: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
ad90: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
ada0: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
adb0: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
adc0: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
add0: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
ade0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
adf0: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
ae00: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
ae10: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
ae20: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
ae30: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
ae40: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
ae50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
ae60: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
ae70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
ae80: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
ae90: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
aea0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
aeb0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
aec0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
aed0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
aee0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
aef0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
af00: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
af10: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
af20: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
af30: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
af40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
af50: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
af60: 20 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   0;.    default:
af70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
af80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
af90: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
afa0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
afb0: 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  n is a constant 
afc0: 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a  which would be.*
afd0: 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f  * unchanged by O
afe0: 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68 20  P_Affinity with 
aff0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69 76  the affinity giv
b000: 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  en in the second
b010: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
b020: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b030: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
b040: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f  rmine if the OP_
b050: 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69  Affinity operati
b060: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69  on.** can be omi
b070: 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64  tted.  When in d
b080: 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53  oubt return FALS
b090: 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61  E.  A false nega
b0a0: 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c  tive.** is harml
b0b0: 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f  ess.  A false po
b0c0: 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c  sitive, however,
b0d0: 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74   can result in t
b0e0: 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77  he wrong.** answ
b0f0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
b100: 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66  e3ExprNeedsNoAff
b110: 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73  inityChange(cons
b120: 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20  t Expr *p, char 
b130: 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20  aff){.  u8 op;. 
b140: 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
b150: 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75  _AFF_NONE ) retu
b160: 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
b170: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
b180: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
b190: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
b1a0: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
b1b0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
b1c0: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
b1d0: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
b1e0: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
b1f0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
b200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
b210: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
b220: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
b230: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
b240: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b250: 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
b260: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
b270: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c  LITE_AFF_REAL ||
b280: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b290: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
b2a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
b2b0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  NG: {.      retu
b2c0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
b2d0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20  FF_TEXT;.    }. 
b2e0: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
b2f0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
b300: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
b310: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
b320: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
b330: 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a  iTable>=0 );  /*
b340: 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72   p cannot be par
b350: 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e  t of a CHECK con
b360: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
b370: 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75   return p->iColu
b380: 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26  mn<0.          &
b390: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
b3a0: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
b3b0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
b3c0: 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  MERIC);.    }.  
b3d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b3e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b3f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b400: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
b410: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
b420: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
b430: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
b440: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
b450: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
b460: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b470: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
b480: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
b490: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b4a0: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
b4b0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
b4c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
b4d0: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
b4e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b4f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
b500: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b510: 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
b520: 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  o the IN operato
b530: 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  r optimization o
b540: 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  n a.** query of 
b550: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
b560: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
b570: 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65  T ...).**.** Whe
b580: 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  re the SELECT...
b590: 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73 70   clause is as sp
b5a0: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 70  ecified by the p
b5b0: 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
b5c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  .** routine..**.
b5d0: 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62  ** The Select ob
b5e0: 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20 68  ject passed in h
b5f0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b600: 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64  preprocessed and
b610: 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61   no.** errors ha
b620: 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a  ve been found..*
b630: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
b640: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
b650: 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64  tatic int isCand
b660: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65  idateForInOpt(Se
b670: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
b680: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
b690: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
b6a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
b6b0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b6c0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
b6d0: 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d         /* right-
b6e0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
b6f0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
b700: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
b710: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b720: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
b730: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
b740: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
b750: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
b760: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
b770: 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
b780: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
b790: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
b7a0: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
b7b0: 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
b7c0: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
b7d0: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
b7e0: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
b7f0: 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
b800: 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
b810: 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
b820: 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
b830: 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
b840: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
b850: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
b860: 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
b870: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
b880: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
b890: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
b8a0: 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8c0: 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
b8d0: 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  use */.  assert(
b8e0: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
b8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b900: 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e  /* No LIMIT mean
b910: 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20  s no OFFSET */. 
b920: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
b930: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b940: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
b950: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
b960: 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  /.  pSrc = p->pS
b970: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
b980: 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc!=0 );.  if( p
b990: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
b9a0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b9b0: 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d    /* Single term
b9c0: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
b9d0: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  */.  if( pSrc->a
b9e0: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
b9f0: 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
ba00: 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ROM is not a sub
ba10: 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f  query or view */
ba20: 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
ba30: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28  a[0].pTab;.  if(
ba40: 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20   NEVER(pTab==0) 
ba50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
ba60: 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
ba70: 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
ba80: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
ba90: 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
baa0: 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
bab0: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
bac0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
bad0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
bae0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
baf0: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
bb00: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
bb10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
bb20: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
bb30: 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e     /* One column
bb40: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
bb50: 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69  et */.  if( pELi
bb60: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
bb70: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
bb80: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
bb90: 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ult is a column 
bba0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
bbb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bbc0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
bbd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
bbe0: 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  n OP_Once instru
bbf0: 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61  ction and alloca
bc00: 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 73  te space for its
bc10: 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68   flag. Return th
bc20: 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  e .** address of
bc30: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
bc40: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
bc50: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72  ite3CodeOnce(Par
bc60: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
bc70: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
bc80: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
bc90: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
bca0: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
bcb0: 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  oded */.  return
bcc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bcd0: 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70  p1(v, OP_Once, p
bce0: 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b  Parse->nOnce++);
bcf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bd00: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
bd10: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
bd20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
bd30: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
bd40: 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
bd50: 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
bd60: 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
bd70: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
bd80: 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
bd90: 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
bda0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
bdb0: 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
bdc0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
bdd0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
bde0: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
bdf0: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
be00: 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
be10: 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
be20: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
be30: 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
be40: 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
be50: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
be60: 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
be70: 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
be80: 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
be90: 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
bea0: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
beb0: 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
bec0: 68 61 74 20 74 68 65 20 52 48 53 20 6f 66 20 74  hat the RHS of t
bed0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
bee0: 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
bef0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
bf00: 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
bf10: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
bf20: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
bf30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
bf40: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
bf50: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
bf60: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
bf70: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
bf80: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
bf90: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
bfa0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
bfb0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
bfc0: 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
bfd0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
bfe0: 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
bff0: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
c000: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
c010: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
c020: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
c030: 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
c040: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
c050: 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
c060: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
c070: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
c080: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
c0b0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
c0c0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
c0d0: 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
c0e0: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
c0f0: 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
c100: 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
c110: 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
c120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
c130: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
c140: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
c150: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
c160: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
c170: 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
c180: 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
c190: 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
c1a0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
c1b0: 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
c1c0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
c1d0: 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
c1e0: 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
c1f0: 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
c200: 65 20 65 70 68 65 72 6d 65 72 61 6c 20 74 61 62  e ephermeral tab
c210: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e  le instead of an
c220: 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62  .** existing tab
c230: 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  le.  .**.** If t
c240: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
c250: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
c260: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  en the b-tree wi
c270: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
c280: 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
c290: 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
c2a0: 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64  , skipping any d
c2b0: 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68  uplicates. In th
c2c0: 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70  is case an.** ep
c2d0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
c2e0: 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  st be used unles
c2f0: 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c  s the selected <
c300: 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61  column> is guara
c310: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
c320: 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
c330: 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
c340: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c350: 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73  KEY or it.** has
c360: 20 61 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72   a UNIQUE constr
c370: 61 69 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69  aint or UNIQUE i
c380: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
c390: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
c3a0: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
c3b0: 2c 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  , then the b-tre
c3c0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
c3d0: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
c3e0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
c3f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
c400: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
c410: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
c420: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
c430: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
c440: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
c450: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
c460: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
c470: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
c480: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
c490: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
c4a0: 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
c4b0: 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
c4c0: 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
c4d0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
c4e0: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77  ** needs to know
c4f0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
c500: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  the structure co
c510: 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55  ntains an SQL NU
c520: 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  LL .** value in 
c530: 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74  order to correct
c540: 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ly evaluate expr
c550: 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20  essions like "X 
c560: 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49  IN (Y, Z)"..** I
c570: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
c580: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
c590: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
c5a0: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
c5b0: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
c5c0: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
c5d0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
c5e0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
c5f0: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
c600: 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49  o *prNotFound. I
c610: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
c620: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
c630: 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
c640: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
c650: 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69  en *prNotFound i
c660: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
c670: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
c680: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
c690: 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
c6a0: 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
c6b0: 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a  rNotFound, then.
c6c0: 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76  ** its initial v
c6d0: 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 20 49  alue is NULL.  I
c6e0: 66 20 74 68 65 20 28 2e 2e 2e 29 20 64 6f 65 73  f the (...) does
c6f0: 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73   not remain cons
c700: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tant.** for the 
c710: 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  duration of the 
c720: 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20  query (i.e. the 
c730: 53 45 4c 45 43 54 20 77 69 74 68 69 6e 20 74 68  SELECT within th
c740: 65 20 28 2e 2e 2e 29 0a 2a 2a 20 69 73 20 61 20  e (...).** is a 
c750: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
c760: 65 72 79 29 20 74 68 65 6e 20 74 68 65 20 76 61  ery) then the va
c770: 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  lue of the alloc
c780: 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73  ated register is
c790: 0a 2a 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c  .** reset to NUL
c7a0: 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20  L each time the 
c7b0: 73 75 62 71 75 65 72 79 20 69 73 20 72 65 72 75  subquery is reru
c7c0: 6e 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  n. This allows t
c7d0: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
c7e0: 75 73 65 20 76 64 62 65 20 63 6f 64 65 20 65 71  use vdbe code eq
c7f0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
c800: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
c810: 20 20 20 69 66 28 20 72 65 67 69 73 74 65 72 3d     if( register=
c820: 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20  =NULL ){.**     
c830: 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74  has_null = <test
c840: 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75   if data structu
c850: 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c  re contains null
c860: 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65  >.**     registe
c870: 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  r = 1.**   }.**.
c880: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ** in order to a
c890: 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65  void running the
c8a0: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
c8b0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
c8c0: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20  s null>.** test 
c8d0: 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20  more often than 
c8e0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  is necessary..*/
c8f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c900: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
c910: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  t sqlite3FindInI
c920: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
c930: 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e  se, Expr *pX, in
c940: 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a  t *prNotFound){.
c950: 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
c980: 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
c990: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
c9a0: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
c9d0: 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
c9e0: 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
c9f0: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
ca00: 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
ca10: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
ca20: 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
ca30: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
ca40: 6e 69 71 75 65 20 3d 20 28 70 72 4e 6f 74 46 6f  nique = (prNotFo
ca50: 75 6e 64 3d 3d 30 29 3b 20 20 20 2f 2a 20 54 72  und==0);   /* Tr
ca60: 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
ca70: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
ca80: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ca90: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
caa0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
cab0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
cac0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
cad0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
cae0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
caf0: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
cb00: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
cb10: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
cb20: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
cb30: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
cb40: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
cb50: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
cb60: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
cb70: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
cb80: 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70  p = (ExprHasProp
cb90: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
cba0: 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70  elect) ? pX->x.p
cbb0: 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69  Select : 0);.  i
cbc0: 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65  f( ALWAYS(pParse
cbd0: 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73  ->nErr==0) && is
cbe0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
cbf0: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
cc00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cc10: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
cc20: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
cc30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
cc40: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
cc70: 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
cc80: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
ccb0: 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  ssion <column> *
ccc0: 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b 20  /.    i16 iCol; 
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccf0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
cd00: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
cd10: 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
cd40: 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
cd50: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
cd60: 70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  p );            
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cd80: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
cd90: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
cda0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
cdb0: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cdd0: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
cde0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
cdf0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ce00: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
ce10: 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
ce20: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
ce30: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
ce40: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ce50: 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ce70: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
ce80: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
ce90: 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
cea0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
ceb0: 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  b;.    pExpr = p
cec0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
ced0: 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d  Expr;.    iCol =
cee0: 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69 43 6f   (i16)pExpr->iCo
cef0: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
cf00: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
cf10: 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
cf20: 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
cf30: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
cf40: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
cf50: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
cf60: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
cf70: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
cf80: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
cf90: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
cfa0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
cfb0: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
cfc0: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
cfd0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  me);..    /* Thi
cfe0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
cff0: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
d000: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
d010: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
d020: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
d030: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
d040: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
d050: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
d060: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
d070: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
d080: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
d090: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
d0a0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d0b0: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
d0c0: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
d0d0: 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  se);.      VdbeC
d0e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
d0f0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
d100: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
d110: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
d120: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
d130: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
d140: 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20  X_ROWID;..      
d150: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d160: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
d170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d180: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
d1b0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
d1c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
d1d0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
d1e0: 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72  ed by the compar
d1f0: 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65  ison. If an inde
d200: 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  x is to.      **
d210: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
d220: 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c  e of a temp-tabl
d230: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72  e, it must be or
d240: 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a  dered according.
d250: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73        ** to this
d260: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d270: 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43  nce.  */.      C
d280: 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
d290: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
d2a0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
d2b0: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45  e, pX->pLeft, pE
d2c0: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
d2d0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
d2e0: 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
d2f0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
d300: 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20  form the .      
d310: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
d320: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
d330: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
d340: 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
d350: 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20    ** it is not, 
d360: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
d370: 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e  le to use any in
d380: 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dex..      */.  
d390: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
d3a0: 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  _ok = sqlite3Ind
d3b0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
d3c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
d3d0: 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20  ].affinity);..  
d3e0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
d3f0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
d400: 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
d410: 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
d420: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
d430: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
d440: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
d450: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26  Col).         &&
d460: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
d470: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
d480: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
d490: 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20  , 0)==pReq.     
d4a0: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
d4b0: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
d4c0: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49  nKeyCol==1 && pI
d4d0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
d4e0: 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29  None)).        )
d4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
d500: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
d510: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
d520: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d530: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d540: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d550: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
d560: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
d570: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
d580: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
d590: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
d5a0: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
d5b0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d5c0: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
d5d0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
d5e0: 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
d5f0: 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
d600: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
d610: 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
d620: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
d630: 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
d640: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
d650: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ];..          if
d660: 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26 20  ( prNotFound && 
d670: 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  !pTab->aCol[iCol
d680: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  ].notNull ){.   
d690: 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74 46           *prNotF
d6a0: 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ound = ++pParse-
d6b0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
d6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d6d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
d6e0: 20 30 2c 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29   0, *prNotFound)
d6f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d710: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
d720: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Addr);.        }
d730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d740: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
d750: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
d760: 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20  ld not found an 
d770: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
d780: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
d790: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
d7a0: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
d7b0: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
d7c0: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
d7d0: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
d7e0: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
d7f0: 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
d800: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
d810: 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
d820: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
d830: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
d840: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
d850: 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20   if( prNotFound 
d860: 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46  ){.      *prNotF
d870: 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e  ound = rMayHaveN
d880: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
d890: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
d8a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d8b0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 2a 70 72   OP_Null, 0, *pr
d8c0: 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 7d  NotFound);.    }
d8d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
d8e0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
d8f0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58   0;.      if( pX
d900: 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
d910: 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72  <0 && !ExprHasPr
d920: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
d930: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
d940: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d950: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20  NDEX_ROWID;.    
d960: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d970: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d980: 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72  ct(pParse, pX, r
d990: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79  MayHaveNull, eTy
d9a0: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
d9b0: 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ID);.    pParse-
d9c0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61  >nQueryLoop = sa
d9d0: 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
d9e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
d9f0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
da00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
da10: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
da20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
da30: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
da40: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
da50: 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73   subquery expres
da60: 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a  sion, EXISTS,.**
da70: 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73   or IN operators
da80: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
da90: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
daa0: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
dab0: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
dac0: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
dad0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
dae0: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
daf0: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
db00: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
db10: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
db20: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
db30: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
db40: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
db50: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
db60: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
db70: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
db80: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
db90: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
dba0: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
dbb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dbc0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
dbd0: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
dbe0: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
dbf0: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
dc00: 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
dc10: 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
dc20: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
dc30: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
dc40: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
dc50: 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
dc60: 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
dc70: 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
dc80: 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
dc90: 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
dca0: 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
dcb0: 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
dcc0: 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
dcd0: 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
dce0: 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
dcf0: 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
dd00: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
dd10: 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
dd20: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
dd30: 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a  eys B-Tree..**.*
dd40: 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
dd50: 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  l is non-zero, t
dd60: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
dd70: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
dd80: 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20  an IN.** (not a 
dd90: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
dda0: 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52  ) and that the R
ddb0: 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  HS might contain
ddc0: 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 46 75 72 74  s NULLs..** Furt
ddd0: 68 65 72 6d 6f 72 65 2c 20 74 68 65 20 49 4e 20  hermore, the IN 
dde0: 69 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  is in a WHERE cl
ddf0: 61 75 73 65 20 61 6e 64 20 74 68 61 74 20 77 65  ause and that we
de00: 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20   really want.** 
de10: 74 6f 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  to iterate over 
de20: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
de30: 4e 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 6f 72  N operator in or
de40: 64 65 72 20 74 6f 20 71 75 69 63 6b 6c 79 20 6c  der to quickly l
de50: 6f 63 61 74 65 0a 2a 2a 20 61 6c 6c 20 63 6f 72  ocate.** all cor
de60: 72 65 73 70 6f 6e 64 69 6e 67 20 4c 48 53 20 65  responding LHS e
de70: 6c 65 6d 65 6e 74 73 2e 20 20 41 6c 6c 20 74 68  lements.  All th
de80: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
de90: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a  is initialize.**
dea0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
deb0: 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
dec0: 75 6c 6c 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  ull to NULL.  Ca
ded0: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
dee0: 69 6c 6c 20 74 61 6b 65 0a 2a 2a 20 63 61 72 65  ill take.** care
def0: 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
df00: 73 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  s register value
df10: 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
df20: 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
df30: 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  free..**.** If r
df40: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 7a  MayHaveNull is z
df50: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
df60: 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
df70: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 0a  y is being used.
df80: 2a 2a 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ** for membershi
df90: 70 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20  p testing only. 
dfa0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
dfb0: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
dfc0: 61 6e 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  any.** registers
dfd0: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65   to indicate the
dfe0: 20 70 72 65 73 65 6e 63 65 20 6f 72 20 61 62 73   presence or abs
dff0: 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 6f 6e  ence of NULLs on
e000: 20 74 68 65 20 52 48 53 2e 0a 2a 2a 0a 2a 2a 20   the RHS..**.** 
e010: 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
e020: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
e030: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
e040: 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
e050: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
e060: 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  For IN operators
e070: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
e080: 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75  occurs, the retu
e090: 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a  rn value is 0..*
e0a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e0b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
e0c0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
e0d0: 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
e0e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e0f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e100: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
e110: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
e120: 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
e130: 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
e140: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
e150: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  t rMayHaveNull, 
e160: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
e170: 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
e180: 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
e190: 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
e1a0: 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
e1b0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
e1c0: 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
e1d0: 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
e1e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73   */.){.  int tes
e1f0: 74 41 64 64 72 20 3d 20 2d 31 3b 20 20 20 20 20  tAddr = -1;     
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
e220: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
e230: 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
e260: 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
e270: 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
e280: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e290: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e2a0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
e2b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
e2c0: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
e2d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
e2e0: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
e2f0: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
e300: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
e310: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
e320: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
e330: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e340: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
e350: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
e360: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
e370: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
e380: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
e390: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
e3a0: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
e3b0: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
e3c0: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
e3d0: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
e3e0: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
e3f0: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
e400: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
e410: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
e420: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
e430: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
e440: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
e450: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
e460: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
e470: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
e480: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
e490: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
e4a0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
e4b0: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
e4c0: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
e4d0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e4e0: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
e4f0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69  rage(v);.  }..#i
e500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e510: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
e520: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
e530: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
e540: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
e550: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
e560: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
e570: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
e580: 59 20 25 64 22 2c 20 74 65 73 74 41 64 64 72 3e  Y %d", testAddr>
e590: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
e5a0: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
e5b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
e5c0: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
e5d0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e5e0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
e5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e600: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
e610: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
e620: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
e630: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
e640: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
e650: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e660: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
e670: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
e680: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
e690: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
e6a0: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
e6b0: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
e6c0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
e6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e6e0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
e6f0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
e700: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
e710: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
e720: 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
e730: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
e740: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
e750: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e760: 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
e770: 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
e780: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d  */..      if( rM
e790: 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20  ayHaveNull ){.  
e7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e7b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e7c0: 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  ll, 0, rMayHaveN
e7d0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ull);.      }.. 
e7e0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
e7f0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e800: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
e810: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
e820: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
e830: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
e840: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
e850: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
e860: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
e870: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
e880: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
e890: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
e8a0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
e8b0: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
e8c0: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
e8d0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
e8e0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
e8f0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
e900: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
e910: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e920: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
e930: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e940: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
e950: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
e960: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
e970: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
e980: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
e990: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
e9a0: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
e9b0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
e9c0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
e9d0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
e9e0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
e9f0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
ea00: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
ea10: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
ea20: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
ea30: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
ea40: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
ea50: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
ea60: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
ea70: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
ea80: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
ea90: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
eaa0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
eab0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
eac0: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
ead0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
eae0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
eaf0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
eb00: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
eb10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eb20: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
eb30: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
eb40: 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
eb50: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
eb60: 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
eb70: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
eb80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31  pParse->db, 1, 1
eb90: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
eba0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
ebb0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
ebc0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
ebd0: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
ebe0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
ebf0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
ec00: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
ec10: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
ec20: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ec30: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
ec40: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
ec50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
ec60: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
ec70: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
ec80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
ec90: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
eca0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
ecb0: 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
ecc0: 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
ecd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
ece0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
ecf0: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
ed00: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
ed10: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
ed20: 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66  ffSdst = (u8)aff
ed30: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61  inity;.        a
ed40: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
ed50: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
ed60: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
ed70: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
ed80: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 69 4c  r->x.pSelect->iL
ed90: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
eda0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
edb0: 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
edc0: 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
edd0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
ede0: 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oc() */.        
edf0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
ee00: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
ee10: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73  >x.pSelect, &des
ee20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
ee30: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
ee40: 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
ee50: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ee60: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ee70: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
ee80: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
ee90: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
eea0: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
eeb0: 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69  !=0 ); /* OOM wi
eec0: 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66  ll cause exit af
eed0: 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ter sqlite3Selec
eee0: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  t() */.        a
eef0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
ef00: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
ef10: 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
ef20: 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  r>0 );.        a
ef30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
ef40: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
ef50: 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
ef60: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
ef70: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
ef80: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
ef90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
efa0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
eff0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
f000: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
f010: 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
f020: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
f030: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
f040: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
f050: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
f060: 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
f070: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
f080: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
f090: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
f0a0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
f0b0: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
f0c0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f0d0: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
f0e0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
f0f0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
f100: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
f110: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
f120: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
f130: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
f140: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
f150: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
f160: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
f170: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
f180: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
f190: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
f1a0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
f1b0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
f1c0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
f1d0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  em;.        int 
f1e0: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20  r1, r2, r3;..   
f1f0: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
f200: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
f210: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
f220: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f240: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
f250: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f260: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
f270: 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
f280: 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
f290: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
f2a0: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
f2b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
f2c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
f2d0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f2e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
f2f0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
f300: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
f310: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
f320: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
f330: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
f340: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
f350: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f360: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
f370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f380: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
f390: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
f3a0: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
f3b0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
f3c0: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
f3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
f3e0: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
f3f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
f400: 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
f410: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
f420: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f430: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
f440: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
f450: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
f460: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
f470: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
f480: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
f490: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
f4a0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
f4b0: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
f4c0: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
f4d0: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
f4e0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
f4f0: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
f500: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
f510: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
f520: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
f530: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
f540: 41 64 64 72 3e 3d 30 20 26 26 20 21 73 71 6c 69  Addr>=0 && !sqli
f550: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f560: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
f570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f580: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
f590: 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 20 20   testAddr);.    
f5a0: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
f5b0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
f5c0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
f5d0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
f5e0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
f5f0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
f600: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
f610: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
f620: 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78  wid && sqlite3Ex
f630: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c  prIsInteger(pE2,
f640: 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a   &iValToIns) ){.
f650: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f660: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f670: 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70   OP_InsertInt, p
f680: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
f690: 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20  , iValToIns);.  
f6a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f6b0: 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20             r3 = 
f6c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
f6d0: 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
f6e0: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
f6f0: 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
f700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
f710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f720: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
f730: 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  nt, r3,.        
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f760: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f770: 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
f780: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
f790: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
f7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f7b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
f7c0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f7d0: 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
f7e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f800: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f810: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
f820: 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
f830: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
f840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f850: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
f860: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
f870: 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
f880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
f8a0: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
f8b0: 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20  Table, r2);.    
f8c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
f8e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
f8f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f900: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
f910: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f920: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f930: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
f940: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
f950: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f960: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
f970: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
f980: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
f990: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
f9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f9b0: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
f9c0: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
f9d0: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
f9e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
f9f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20   /* If this has 
fa00: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
fa10: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
fa20: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
fa30: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
fa40: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
fa50: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
fa60: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
fa70: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
fa80: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
fa90: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49  l in iColumn.  I
faa0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
fab0: 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20  STS, write.     
fac0: 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30   ** an integer 0
fad0: 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
fae0: 20 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f   1 (exists) into
faf0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20   a memory cell. 
fb00: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f       ** and reco
fb10: 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  rd that memory c
fb20: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
fb30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
fb40: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
fb70: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
fb80: 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
fb90: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
fbc0: 20 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73   with SELECt res
fbd0: 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ult */..      te
fbe0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
fbf0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
fc00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fc10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
fc20: 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
fc30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
fc40: 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
fc50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
fc60: 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  CT );..      ass
fc70: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
fc80: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
fc90: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
fca0: 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
fcb0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
fcc0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
fcd0: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
fce0: 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
fcf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
fd00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
fd10: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
fd20: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
fd30: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
fd40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fd50: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
fd60: 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
fd70: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fd80: 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
fd90: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
fda0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fdb0: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
fdc0: 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
fdd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fde0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fdf0: 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
fe00: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
fe10: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
fe20: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
fe30: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
fe40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
fe50: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
fe60: 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
fe70: 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
fe80: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
fe90: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
fea0: 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20  TEGER, 0, 0,.   
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
fed0: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
fee0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  [1]);.      pSel
fef0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
ff00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
ff10: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
ff20: 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
ff30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
ff40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
ff50: 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  eg = dest.iSDPar
ff60: 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  m;.      ExprSet
ff70: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
ff80: 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
ff90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ffa0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74    }.  }..  if( t
ffb0: 65 73 74 41 64 64 72 3e 3d 30 20 29 7b 0a 20 20  estAddr>=0 ){.  
ffc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ffd0: 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64  pHere(v, testAdd
ffe0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
fff0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
10000 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  arse);..  return
10010 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
10020 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
10030 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
10040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10050 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
10060 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
10070 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
10080 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
10090 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
100a0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
100b0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
100c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
100d0 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
100e0 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  is a scalar expr
100f0 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67  ession.  The rig
10100 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
10110 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61  S).** is an arra
10120 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
10130 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65  e values.  The e
10140 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
10150 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a  e if the LHS is.
10160 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
10170 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68  hin the RHS.  Th
10180 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  e value of the e
10190 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b  xpression is unk
101a0 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69  nown (NULL).** i
101b0 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
101c0 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20  L or if the LHS 
101d0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
101e0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
101f0 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63  and the.** RHS c
10200 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10210 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10220 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10230 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
10240 64 65 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  de will jump to 
10250 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
10260 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
10270 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
10280 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
10290 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
102a0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
102b0 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
102c0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
102d0 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
102e0 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
102f0 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
10300 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
10310 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
10320 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
10330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10340 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
10350 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10360 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10370 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
10380 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
10390 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
103a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
103b0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
103c0 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
103d0 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
103e0 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
103f0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
10400 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
10410 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
10420 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
10430 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
10440 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
10450 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
10460 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
10470 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
10480 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
10490 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
104a0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
104b0 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
104c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
104d0 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74  rison affinity t
104e0 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65  o use */.  int e
104f0 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
10500 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
10510 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b  RHS */.  int r1;
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10530 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
10540 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64  register */.  Vd
10550 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10560 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
10570 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10580 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ion */..  /* Com
10590 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20  pute the RHS.   
105a0 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
105b0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
105c0 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70  cursor.  ** pExp
105d0 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63  r->iTable will c
105e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
105f0 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
10600 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
10610 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10620 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
10630 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
10640 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
10650 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
10660 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
10670 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
10680 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
10690 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
106a0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
106b0 2c 20 70 45 78 70 72 2c 20 26 72 52 68 73 48 61  , pExpr, &rRhsHa
106c0 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69  sNull);..  /* Fi
106d0 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
106e0 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
106f0 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
10700 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
10710 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
10720 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
10730 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
10740 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
10750 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66  e for.  ** P4 of
10760 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
10770 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20    */.  affinity 
10780 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
10790 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
107a0 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
107b0 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
107c0 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
107d0 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  )"..  */.  sqlit
107e0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
107f0 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20  pParse);.  r1 = 
10800 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
10810 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
10820 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10830 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10840 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  t, r1);..  /* If
10850 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
10860 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10870 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73  t is either fals
10880 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64  e or NULL depend
10890 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 77 68 65 74  ing.  ** on whet
108a0 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65  her the RHS is e
108b0 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73  mpty or not, res
108c0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2f 0a  pectively..  */.
108d0 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
108e0 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
108f0 0a 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74  .    /* Shortcut
10900 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
10910 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66  case where the f
10920 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75  alse and NULL ou
10930 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 2a  tcomes are.    *
10940 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  * the same. */. 
10950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10960 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
10970 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c  l, r1, destIfNul
10980 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
10990 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
109a0 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
109b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
109c0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
109d0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
109e0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
109f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10a00 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
10a10 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
10a20 6c 73 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  lse);.    VdbeCo
10a30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
10a40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10a50 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
10a60 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
10a70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10a80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
10a90 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
10aa0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
10ab0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
10ac0 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53  is case, the RHS
10ad0 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66   is the ROWID of
10ae0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20   table b-tree.  
10af0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10b00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10b10 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
10b20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64  destIfFalse); Vd
10b30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10b50 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
10b60 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
10b70 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
10b80 2c 20 72 31 29 3b 0a 20 20 20 20 56 64 62 65 43  , r1);.    VdbeC
10b90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
10ba0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  lse{.    /* In t
10bb0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
10bc0 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
10bd0 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
10be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10bf0 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p4(v, OP_Affinit
10c00 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66  y, r1, 1, 0, &af
10c10 66 69 6e 69 74 79 2c 20 31 29 3b 0a 0a 20 20 20  finity, 1);..   
10c20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d   /* If the set m
10c30 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66  embership test f
10c40 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ails, then the r
10c50 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20  esult of the .  
10c60 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29    ** "x IN (...)
10c70 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  " expression mus
10c80 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72  t be either 0 or
10c90 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65   NULL. If the se
10ca0 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  t.    ** contain
10cb0 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
10cc0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10cd0 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
10ce0 65 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  et .    ** conta
10cf0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
10d00 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
10d10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
10d20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  the.    ** expre
10d30 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
10d40 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  LL..    */.    i
10d50 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d  f( rRhsHasNull==
10d60 30 20 7c 7c 20 64 65 73 74 49 66 46 61 6c 73 65  0 || destIfFalse
10d70 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 29 7b 0a  ==destIfNull ){.
10d80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
10d90 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
10da0 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
10db0 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68  ile time that th
10dc0 65 20 52 48 53 0a 20 20 20 20 20 20 2a 2a 20 63  e RHS.      ** c
10dd0 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55  annot contain NU
10de0 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
10df0 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
10e00 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 6f  esult.      ** o
10e10 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
10e20 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
10e30 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
10e40 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
10e50 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69   ** Also run thi
10e60 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c  s branch if NULL
10e70 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
10e80 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 2a 2a  o FALSE.      **
10e90 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
10ea0 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
10eb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ed0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
10ee0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
10ef0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
10f00 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
10f10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10f30 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61    /* In this bra
10f40 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20  nch, the RHS of 
10f50 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e  the IN might con
10f60 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a  tain a NULL and.
10f70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
10f80 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20  sence of a NULL 
10f90 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73  on the RHS makes
10fa0 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e   a difference in
10fb0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 75   the.      ** ou
10fc0 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  tcome..      */.
10fd0 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32        int j1, j2
10fe0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;..      /* Firs
10ff0 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  t check to see i
11000 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
11010 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
11020 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  S.  If so,.     
11030 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 72 65   ** then the pre
11040 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69  sence of NULLs i
11050 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 20 6e  n the RHS does n
11060 6f 74 20 6d 61 74 74 65 72 2c 20 73 6f 20 6a 75  ot matter, so ju
11070 6d 70 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  mp.      ** over
11080 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
11090 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 0a 20   that follows.. 
110a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 31       */.      j1
110b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
110c0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
110d0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
110e0 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20  le, 0, r1, 1);. 
110f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
11100 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e(v);..      /* 
11110 48 65 72 65 20 77 65 20 62 65 67 69 6e 20 67 65  Here we begin ge
11120 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 68  nerating code th
11130 61 74 20 72 75 6e 73 20 69 66 20 74 68 65 20 4c  at runs if the L
11140 48 53 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  HS is not.      
11150 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
11160 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 47 65  hin the RHS.  Ge
11170 6e 65 72 61 74 65 20 61 64 64 69 74 69 6f 6e 61  nerate additiona
11180 6c 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  l code that.    
11190 20 20 2a 2a 20 74 65 73 74 73 20 74 68 65 20 52    ** tests the R
111a0 48 53 20 66 6f 72 20 4e 55 4c 4c 73 2e 20 20 49  HS for NULLs.  I
111b0 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  f the RHS contai
111c0 6e 73 20 61 20 4e 55 4c 4c 20 74 68 65 6e 0a 20  ns a NULL then. 
111d0 20 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20       ** jump to 
111e0 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
111f0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4e 55 4c  there are no NUL
11200 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  Ls in the RHS th
11210 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6a 75 6d 70  en.      ** jump
11220 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 2e   to destIfFalse.
11230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11250 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 52 68 73  2(v, OP_If, rRhs
11260 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  HasNull, destIfN
11270 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
11280 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
11290 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
112a0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 52 68 73  , OP_IfNot, rRhs
112b0 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 46  HasNull, destIfF
112c0 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  alse); VdbeCover
112d0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 6a 32  age(v);.      j2
112e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
112f0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
11300 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
11310 6c 65 2c 20 30 2c 20 72 52 68 73 48 61 73 4e 75  le, 0, rRhsHasNu
11320 6c 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64  ll, 1);.      Vd
11330 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
11360 65 67 65 72 2c 20 30 2c 20 72 52 68 73 48 61 73  eger, 0, rRhsHas
11370 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
11380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11390 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
113a0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
113b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
113c0 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20  pHere(v, j2);.  
113d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
113e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
113f0 67 65 72 2c 20 31 2c 20 72 52 68 73 48 61 73 4e  ger, 1, rRhsHasN
11400 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
11410 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11420 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
11430 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  tIfNull);..     
11440 20 2f 2a 20 54 68 65 20 4f 50 5f 46 6f 75 6e 64   /* The OP_Found
11450 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
11460 68 69 73 20 62 72 61 6e 63 68 20 6a 75 6d 70 73  his branch jumps
11470 20 68 65 72 65 20 77 68 65 6e 20 74 72 75 65 2c   here when true,
11480 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 69   .      ** causi
11490 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 49  ng the overall I
114a0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  N expression eva
114b0 6c 75 61 74 69 6f 6e 20 74 6f 20 66 61 6c 6c 20  luation to fall 
114c0 74 68 72 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a  through..      *
114d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
114e0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
114f0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
11500 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11510 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
11520 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
11530 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
11540 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
11550 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
11560 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  "));.}.#endif /*
11570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11580 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
11590 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62  Duplicate an 8-b
115a0 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61  yte value.*/.sta
115b0 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79  tic char *dup8by
115c0 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  tes(Vdbe *v, con
115d0 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20  st char *in){.  
115e0 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69  char *out = sqli
115f0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73  te3DbMallocRaw(s
11600 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
11610 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29   8);.  if( out )
11620 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74  {.    memcpy(out
11630 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20  , in, 8);.  }.  
11640 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23  return out;.}..#
11650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11660 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
11670 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
11680 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
11690 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
116a0 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
116b0 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
116c0 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
116d0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
116e0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
116f0 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
11700 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
11710 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
11720 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
11730 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
11740 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
11750 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
11760 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
11770 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
11780 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
11790 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
117a0 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
117b0 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
117c0 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
117d0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
117e0 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
117f0 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
11800 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72   value;.    char
11810 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65   *zV;.    sqlite
11820 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c  3AtoF(z, &value,
11830 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11840 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (z), SQLITE_UTF8
11850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11860 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
11870 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65  ue) ); /* The ne
11880 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74  w AtoF never ret
11890 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20  urns NaN */.    
118a0 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
118b0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
118c0 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79  .    zV = dup8by
118d0 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
118e0 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
118f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11900 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
11910 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c  , 0, zV, P4_REAL
11920 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
11930 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11940 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
11950 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
11960 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
11970 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
11980 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
11990 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
119a0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
119b0 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
119c0 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
119d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
119e0 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
119f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
11a00 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
11a10 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
11a20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
11a30 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
11a40 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
11a50 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
11a60 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
11a70 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
11a80 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
11a90 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
11aa0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
11ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ac0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11ad0 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
11ae0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
11af0 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
11b00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11b10 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
11b20 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
11b30 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
11b40 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
11b50 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
11b60 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
11b70 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 69  ITE_UTF8);.    i
11b80 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32  f( c==0 || (c==2
11b90 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a   && negFlag) ){.
11ba0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
11bb0 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
11bc0 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
11bd0 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  2 ? SMALLEST_INT
11be0 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
11bf0 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
11c00 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
11c10 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
11c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11c30 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
11c40 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
11c50 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
11c60 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11c70 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
11c80 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
11c90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11ca0 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
11cb0 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
11cc0 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
11cd0 20 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20   z);.#else.     
11ce0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
11cf0 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
11d00 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
11d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
11d20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a  a cache entry..*
11d30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
11d40 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
11d50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
11d60 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
11d70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70  ){.  if( p->temp
11d80 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Reg ){.    if( p
11d90 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
11da0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
11db0 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
11dc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65       pParse->aTe
11dd0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
11de0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69  empReg++] = p->i
11df0 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Reg;.    }.    p
11e00 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
11e10 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
11e20 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
11e30 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
11e40 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
11e50 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
11e60 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
11e70 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
11e80 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
11e90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11ea0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
11eb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11ec0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
11ed0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
11ee0 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
11ef0 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
11f00 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
11f10 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  che *p;..  asser
11f20 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a  t( iReg>0 );  /*
11f30 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   Register number
11f40 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
11f50 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  itive */.  asser
11f60 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
11f70 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
11f80 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
11f90 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
11fa0 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
11fb0 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
11fc0 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
11fd0 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
11fe0 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
11ff0 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
12000 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
12010 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
12020 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
12030 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
12040 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
12050 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
12060 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
12070 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
12080 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  b, SQLITE_Column
12090 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b  Cache) ) return;
120a0 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70  ..  /* First rep
120b0 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e  lace any existin
120c0 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20  g entry..  **.  
120d0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
120e0 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20   way the column 
120f0 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74  cache is current
12100 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20  ly used, we are 
12110 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20  guaranteed.  ** 
12120 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20  that the object 
12130 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61  will never alrea
12140 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20  dy be in cache. 
12150 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61   Verify this gua
12160 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66  rantee..  */.#if
12170 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f  ndef NDEBUG.  fo
12180 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
12190 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
121a0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
121b0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
121c0 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d  assert( p->iReg=
121d0 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21  =0 || p->iTable!
121e0 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c  =iTab || p->iCol
121f0 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d  umn!=iCol );.  }
12200 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69  .#endif..  /* Fi
12210 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74  nd an empty slot
12220 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
12230 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  */.  for(i=0, p=
12240 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
12250 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
12260 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
12270 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
12280 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  eg==0 ){.      p
12290 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
122a0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
122b0 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20        p->iTable 
122c0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d  = iTab;.      p-
122d0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
122e0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
122f0 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e   iReg;.      p->
12300 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
12310 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
12320 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
12330 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
12340 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
12350 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
12360 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
12370 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
12380 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
12390 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
123a0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
123b0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
123c0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
123d0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
123e0 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
123f0 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
12400 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
12410 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
12420 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
12430 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
12440 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
12450 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
12460 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
12470 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
12480 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
12490 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
124a0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
124b0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
124c0 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
124d0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
124e0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
124f0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
12500 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
12510 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
12520 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62  that registers b
12530 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65  etween iReg..iRe
12540 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69  g+nReg-1 are bei
12550 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
12560 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e  ** Purge the ran
12570 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
12580 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
12590 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cache..*/.void s
125a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
125b0 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  emove(Parse *pPa
125c0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
125d0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
125e0 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d  i;.  int iLast =
125f0 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31   iReg + nReg - 1
12600 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
12610 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
12620 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12630 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12640 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12650 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
12660 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
12670 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26    if( r>=iReg &&
12680 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20   r<=iLast ){.   
12690 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
126a0 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
126b0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
126c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
126d0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
126e0 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
126f0 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
12700 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
12710 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
12720 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
12730 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
12740 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
12750 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
12760 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
12770 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
12780 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
12790 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
127a0 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
127b0 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64  cheLevel++;.#ifd
127c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
127d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
127e0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
127f0 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
12800 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
12810 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  USH to %d\n", pP
12820 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
12830 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  l);.  }.#endif.}
12840 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
12850 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
12860 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
12870 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
12880 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
12890 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74  e previous sqlit
128a0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20  e3ExprCachePush 
128b0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f  operation.  In o
128c0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
128d0 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ore.** the cache
128e0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
128f0 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68   was in prior th
12900 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75  e most recent Pu
12910 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sh..*/.void sqli
12920 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
12930 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
12940 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12950 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
12960 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12970 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31  ->iCacheLevel>=1
12980 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
12990 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66  acheLevel--;.#if
129a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
129b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
129c0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
129d0 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
129e0 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
129f0 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70  POP  to %d\n", p
12a00 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
12a10 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
12a20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
12a30 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
12a40 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
12a50 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
12a60 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
12a70 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  && p->iLevel>pPa
12a80 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
12a90 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
12aa0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
12ab0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
12ac0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
12ad0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
12ae0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
12af0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
12b00 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
12b10 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
12b20 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
12b30 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
12b40 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
12b50 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
12b60 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
12b70 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
12b80 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
12b90 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
12ba0 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
12bb0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
12bc0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
12bd0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
12be0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12bf0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
12c00 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
12c10 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
12c20 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
12c30 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
12c40 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
12c50 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
12c60 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
12c70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
12c80 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
12c90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
12ca0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
12cb0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
12cc0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
12cd0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
12ce0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12cf0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
12d00 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
12d10 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
12d20 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
12d30 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
12d40 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
12d50 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
12d60 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
12d70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
12d80 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
12d90 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
12da0 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
12db0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
12dc0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
12dd0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12de0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
12df0 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
12e00 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
12e10 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
12e20 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
12e30 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
12e40 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
12e50 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
12e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
12e80 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
12e90 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
12ea0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
12eb0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
12ec0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
12ed0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
12ee0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
12ef0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
12f00 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
12f10 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
12f20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
12f30 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
12f40 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
12f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12f60 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
12f70 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
12f80 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
12f90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
12fa0 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
12fb0 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
12fc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12fd0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
12fe0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
12ff0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
13000 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
13010 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
13020 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
13030 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
13040 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
13050 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
13060 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
13070 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
13080 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
13090 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
130a0 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
130b0 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
130c0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
130d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
130e0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
130f0 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
13100 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
13110 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
13120 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
13130 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
13140 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
13150 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
13160 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
13170 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
13180 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
13190 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
131a0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
131b0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
131c0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
131d0 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
131e0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
131f0 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
13200 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
13210 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
13220 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
13230 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
13240 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
13250 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
13260 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
13270 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
13280 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
13290 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
132a0 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
132b0 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
132c0 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
132d0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
132e0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
132f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
13300 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
13310 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
13320 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13330 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
13340 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13350 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
13360 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
13370 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
13380 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
13390 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
133a0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
133b0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
133c0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
133d0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
133e0 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
133f0 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
13400 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
13410 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
13420 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13430 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
13440 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
13450 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
13460 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
13470 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13480 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
13490 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
134a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
134b0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
134c0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
134d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
134e0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
134f0 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
13500 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
13510 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13520 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
13530 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
13540 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
13550 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23  yColCache *p;..#
13560 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
13570 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
13580 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
13590 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
135a0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
135b0 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
135c0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
135d0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
135e0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
135f0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
13600 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
13610 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
13620 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
13630 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
13640 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
13650 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13660 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
13670 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
13680 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
13690 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
136a0 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
136b0 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
136c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
136d0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
136e0 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
136f0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
13700 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
13710 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
13720 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
13730 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
13740 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
13750 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
13760 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
13770 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
13780 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
13790 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
137a0 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
137b0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
137c0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
137d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
137e0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
137f0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
13800 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
13810 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
13820 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13830 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
13840 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
13850 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
13860 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
13870 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
13880 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
13890 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
138a0 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  eg);.  for(i=0, 
138b0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
138c0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
138d0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
138e0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ++){.    int x =
138f0 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
13900 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c  ( x>=iFrom && x<
13910 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20  iFrom+nReg ){.  
13920 20 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69      p->iReg += i
13930 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a  To-iFrom;.    }.
13940 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
13950 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
13960 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
13970 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
13980 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
13990 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
139a0 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
139b0 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
139c0 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
139d0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
139e0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
139f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13a00 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
13a10 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
13a20 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
13a30 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
13a40 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
13a50 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
13a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
13a70 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
13a80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
13a90 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
13aa0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
13ab0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
13ac0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
13ad0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
13ae0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
13af0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
13b00 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
13b10 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
13b20 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
13b30 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
13b40 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
13b50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
13b60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13b70 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
13b80 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
13b90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
13ba0 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
13bb0 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
13bc0 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20  ISTER.*/.static 
13bd0 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
13be0 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
13bf0 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
13c00 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
13c10 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
13c20 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
13c30 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
13c40 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
13c50 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  kip);.}../*.** G
13c60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
13c70 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
13c80 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
13c90 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
13ca0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
13cb0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
13cc0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
13cd0 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
13ce0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
13cf0 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
13d00 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
13d10 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
13d20 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
13d30 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
13d40 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
13d50 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
13d60 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
13d70 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
13d80 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
13d90 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
13da0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
13db0 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
13dc0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
13dd0 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
13de0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
13df0 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
13e00 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
13e10 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
13e20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
13e30 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
13e40 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13e50 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
13e60 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
13e70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
13e80 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
13e90 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13ea0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ec0 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
13ed0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
13ee0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
13ef0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
13f00 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
13f10 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
13f20 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
13f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
13f40 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
13f50 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
13f60 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
13f70 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
13f80 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
13f90 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
13fa0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
13fb0 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
13fc0 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
13fd0 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
13fe0 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
13ff0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14000 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
14010 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14020 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74  tion */.  Expr t
14030 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
14040 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
14050 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
14060 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
14070 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
14080 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
14090 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
140a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
140b0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
140c0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
140d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
140e0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
140f0 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
14100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
14110 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
14120 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
14130 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
14140 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
14150 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
14160 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
14170 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
14180 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
14190 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
141a0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
141b0 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
141c0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
141d0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
141e0 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
141f0 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
14200 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
14210 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
14220 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
14230 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
14240 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
14250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14260 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
14270 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
14280 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
142b0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
142c0 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
142d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
142e0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
142f0 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
14300 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
14310 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
14320 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
14330 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
14340 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  t iTab = pExpr->
14350 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  iTable;.      if
14360 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  ( iTab<0 ){.    
14370 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
14380 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20  ckBase>0 ){.    
14390 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
143a0 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
143b0 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
143c0 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
143d0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
143e0 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
143f0 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
14400 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
14410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14430 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e        /* Deletin
14440 67 20 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c  g from a partial
14450 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
14460 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
14470 65 2d 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a  e->iPartIdxTab;.
14480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14490 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
144a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
144b0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
144c0 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
144f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
14500 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
14530 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65  >op2);.      bre
14540 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14550 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
14560 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
14570 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
14580 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
14590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
145a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
145b0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
145c0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
145d0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
145e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
145f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
14600 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
14610 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
14620 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
14630 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
14640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14650 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
14660 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
14670 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
14680 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
14690 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
146a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
146b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
146c0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
146d0 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
146e0 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
146f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14700 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
14710 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
14720 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14730 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
14740 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
14750 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
14760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
14770 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
14780 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
14790 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
147a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
147b0 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
147c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
147d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
147e0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
147f0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
14800 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
14810 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
14820 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
14830 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
14840 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14850 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
14860 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
14870 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
14880 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
14890 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
148a0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
148b0 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
148c0 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
148d0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
148e0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
148f0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
14900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14910 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
14920 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
14930 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
14940 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14950 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14960 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
14970 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
14980 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
14990 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
149a0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
149b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
149c0 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
149d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
149e0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
149f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
14a00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14a10 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
14a20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
14a30 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
14a40 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
14a50 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
14a60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14a70 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
14a80 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
14a90 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
14aa0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
14ab0 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
14ac0 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
14ad0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14ae0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
14af0 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
14b00 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
14b10 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
14b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14b30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14b40 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
14b50 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
14b60 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
14b70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14b80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14b90 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
14ba0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
14bb0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
14bc0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14bd0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14be0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
14bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14c00 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
14c10 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
14c20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
14c30 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
14c40 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
14c50 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
14c60 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
14c70 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
14c80 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14c90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14ca0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
14cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
14cc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14cd0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
14ce0 29 20 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  ) );.      aff =
14cf0 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
14d00 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
14d10 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
14d20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
14d30 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
14d40 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
14d50 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14d60 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
14d70 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14d80 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
14d90 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14da0 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
14db0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14dc0 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
14dd0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14de0 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
14df0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14e00 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
14e10 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14e20 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
14e30 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14e40 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
14e50 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
14e60 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
14e70 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
14e80 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
14e90 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
14ea0 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
14eb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
14ec0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
14ed0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14ee0 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
14ef0 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
14f00 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
14f10 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
14f20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
14f30 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
14f40 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67  .      if( inReg
14f50 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20  !=target ){.    
14f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
14f80 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
14f90 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
14fa0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
14fb0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14fc0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f  VdbeAddOp1(v, to
14fd0 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  _op, inReg);.   
14fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
14ff0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
15000 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
15010 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
15020 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
15030 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
15040 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
15050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15060 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
15070 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
15080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
15090 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
150a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
150b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
150c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
150d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
150e0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
150f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15100 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
15110 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
15120 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
15130 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15140 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15150 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
15160 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
15170 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
15180 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
15190 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
151a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
151b0 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
151c0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
151d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
151e0 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
151f0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
15200 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
15210 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
15220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
15230 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
15240 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
15250 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
15260 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
15270 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
15280 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
15290 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
152a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
152b0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
152c0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
152d0 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
152e0 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
152f0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
15300 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
15310 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
15320 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
15330 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
15340 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
15350 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61  =OP_Eq);.      a
15360 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
15370 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
15380 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
15390 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
153a0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ne);.      tes
153b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
153c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
153d0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
153e0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
153f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15400 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
15410 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
15420 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15430 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
15440 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
15450 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
15460 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15470 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
15480 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
15490 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
154a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
154b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
154c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
154d0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
154e0 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
154f0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
15500 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
15510 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
15520 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
15530 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
15560 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
15570 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  | SQLITE_NULLEQ)
15580 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
15590 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
155a0 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
155b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
155c0 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
155d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
155e0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
155f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15600 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
15610 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15620 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
15630 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
15640 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
15650 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
15660 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
15670 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
15680 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
15690 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
156a0 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
156b0 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
156c0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
156d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
156e0 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
156f0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
15700 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
15710 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
15720 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
15730 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
15740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15750 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
15760 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
15770 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
15780 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15790 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
157a0 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
157b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
157c0 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
157d0 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
157e0 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
157f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15800 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
15810 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
15820 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
15830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15840 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
15850 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
15860 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
15870 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
15880 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
15890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
158a0 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
158b0 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
158c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
158d0 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
158e0 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
158f0 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
15900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15910 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
15920 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
15930 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
15940 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
15950 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
15960 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15970 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
15980 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
15990 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
159a0 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
159b0 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
159c0 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
159d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
159e0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
159f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15a00 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
15a10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15a20 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
15a30 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
15a40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15a50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15a60 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
15a70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15a80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
15a90 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
15aa0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15ab0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
15ac0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15ad0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
15ae0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15af0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15b00 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
15b10 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
15b20 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
15b30 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
15b40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
15b50 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
15b60 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
15b70 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
15b80 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
15b90 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
15ba0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
15bb0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
15bc0 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
15bd0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
15be0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
15bf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15c00 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
15c10 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
15c20 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
15c30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
15c40 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
15c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15c60 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54      tempX.op = T
15c70 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  K_INTEGER;.     
15c80 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d     tempX.flags =
15c90 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
15ca0 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20  TokenOnly;.     
15cb0 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75     tempX.u.iValu
15cc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
15cd0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
15ce0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15cf0 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
15d00 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
15d10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15d20 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
15d30 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
15d40 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
15d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15d60 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
15d70 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
15d80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
15d90 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
15da0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15db0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
15dc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15dd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15de0 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
15df0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
15e00 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
15e10 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
15e20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15e30 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
15e40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
15e50 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20  OT==OP_Not );   
15e60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15e70 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
15e80 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15e90 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15ea0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15eb0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15ec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15ed0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15ee0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
15ef0 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
15f00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
15f10 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
15f20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15f30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
15f40 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
15f50 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
15f60 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
15f70 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
15f80 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
15f90 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
15fa0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
15fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
15fc0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
15fd0 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
15fe0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
15ff0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16000 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16010 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
16020 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
16030 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16040 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
16050 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
16060 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
16070 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
16090 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
160a0 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
160b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
160c0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
160d0 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
160e0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
160f0 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
16100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16120 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
16130 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
16140 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16150 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
16160 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16170 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
16180 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
16190 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
161a0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
161b0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
161c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
161d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
161e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
161f0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
16210 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16220 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
16230 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
16240 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
16250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16260 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f     inReg = pInfo
16270 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
16280 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
16290 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
162a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
162b0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
162c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
162d0 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
162e0 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
162f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
16300 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
16310 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16320 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
16330 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
16340 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
16350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16360 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
16370 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
16380 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
16390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
163a0 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63  ngth of the func
163b0 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74  tion name in byt
163c0 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  es */.      cons
163d0 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
163e0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
163f0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
16400 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
16410 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
16420 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
16430 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
16440 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
16450 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16460 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
16470 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
16480 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
16490 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
164a0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
164b0 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
164c0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
164d0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
164e0 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
164f0 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
16500 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
16510 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16520 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16530 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
16540 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16550 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
16560 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
16570 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
16580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16590 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
165a0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
165b0 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
165c0 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
165d0 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
165e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
165f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16600 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16610 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
16620 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
16630 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74   nId = sqlite3St
16640 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20  rlen30(zId);.   
16650 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
16660 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
16670 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72  , zId, nId, nFar
16680 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  g, enc, 0);.    
16690 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
166a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
166b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
166c0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
166d0 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  on: %.*s()", nId
166e0 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
166f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
16700 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
16710 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
16720 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
16730 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
16740 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
16750 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
16760 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
16770 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
16780 61 6c 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  alation of.     
16790 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61   ** arguments pa
167a0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  st the first non
167b0 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a  -NULL argument..
167c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
167d0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
167e0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
167f0 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20  _COALESCE ){.   
16800 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c       int endCoal
16810 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  esce = sqlite3Vd
16820 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
16830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16840 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20  nFarg>=2 );.    
16850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16860 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
16870 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
16880 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
16890 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67  for(i=1; i<nFarg
168a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
168b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
168c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
168d0 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f  l, target, endCo
168e0 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
168f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
16900 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
16910 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
16920 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72  move(pParse, tar
16930 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
16940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
16950 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
16960 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16970 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16980 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
16990 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
169a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
169b0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
169c0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rse);.        }.
169d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
169e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
169f0 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
16a00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16a10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16a20 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29  * The UNLIKELY()
16a30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
16a40 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c  o-op.  The resul
16a50 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20  t is the value. 
16a60 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
16a70 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20  irst argument.. 
16a80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16a90 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
16aa0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
16ab0 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20  UNLIKELY ){.    
16ac0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
16ad0 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=1 );.        
16ae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
16af0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
16b00 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
16b10 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
16b20 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
16b30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
16b40 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
16b50 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
16b60 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
16b70 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
16b80 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
16b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
16ba0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
16bb0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
16bc0 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
16bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16be0 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
16bf0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
16c00 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
16c10 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
16c20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
16c30 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
16c40 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
16c50 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
16c60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16c70 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
16c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
16c90 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
16ca0 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
16cb0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
16cc0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
16cd0 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
16ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16cf0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
16d00 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16d10 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
16d20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
16d30 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
16d40 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
16d50 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
16d60 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
16d70 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
16d80 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
16d90 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
16da0 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
16db0 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
16dc0 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
16dd0 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
16de0 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
16df0 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
16e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
16e10 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
16e20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
16e30 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
16e40 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
16e50 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
16e60 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
16e70 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
16e80 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
16e90 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
16ea0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
16eb0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
16ec0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
16ed0 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
16ee0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
16ef0 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
16f00 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
16f10 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
16f20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
16f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
16f40 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
16f50 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
16f60 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
16f70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16f80 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
16f90 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
16fa0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
16fb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16fc0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
16fd0 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
16fe0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
16ff0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
17000 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
17020 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
17030 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
17040 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
17050 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
17060 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17070 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17080 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
17090 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
170a0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
170b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
170c0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
170d0 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
170e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
17110 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  P|SQLITE_ECEL_FA
17120 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73  CTOR);.        s
17130 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
17140 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  op(pParse);     
17150 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
17160 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
17170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17180 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
17190 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
171a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
171b0 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
171c0 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
171d0 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
171e0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
171f0 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
17200 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
17210 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
17220 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
17230 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
17240 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
17250 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
17260 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
17270 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
17280 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
17290 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
172a0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
172b0 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
172c0 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
172d0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
172e0 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
172f0 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
17300 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
17310 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
17320 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
17330 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
17340 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
17350 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
17360 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
17370 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
17380 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
17390 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
173a0 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
173b0 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
173c0 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
173d0 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
173e0 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
173f0 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
17400 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
17410 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
17420 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
17430 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
17440 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17450 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26   if( nFarg>=2 &&
17460 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
17470 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
17480 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
17490 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
174a0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
174b0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
174c0 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  arg->a[1].pExpr)
174d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
174e0 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20  ( nFarg>0 ){.   
174f0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
17500 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
17510 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
17520 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
17530 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
17540 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17550 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
17560 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
17570 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
17580 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
17590 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
175a0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
175b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
175c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
175d0 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
175e0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
175f0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
17600 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17610 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17620 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
17630 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
17640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17650 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
17660 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
17670 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
17680 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
17690 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
176a0 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
176b0 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
176c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
176d0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
176e0 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
176f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
17700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
17710 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17720 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
17730 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
17740 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
17750 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  CT: {.      test
17760 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
17770 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
17780 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
17790 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e  LECT );.      in
177a0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
177b0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
177c0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
177d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
177e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
177f0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
17800 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
17810 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17820 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
17830 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
17840 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17850 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
17860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17870 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
17880 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
17890 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
178a0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
178b0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
178c0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
178d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
178e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
178f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
17900 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17910 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
17920 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
17930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17940 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
17950 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
17960 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17970 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
17980 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
17990 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
179a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
179b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
179c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
179d0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
179e0 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
179f0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
17a00 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
17a10 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
17a20 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
17a30 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
17a40 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
17a50 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
17a60 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
17a70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
17a80 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
17a90 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
17aa0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
17ab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17ac0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
17ad0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
17ae0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
17af0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
17b00 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
17b10 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Item = pExpr->x.
17b20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
17b30 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
17b40 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  LItem->pExpr;.. 
17b50 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17b60 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17b70 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
17b80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
17b90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
17ba0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17bb0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
17bc0 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
17bd0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
17be0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17bf0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
17c00 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
17c10 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17c20 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
17c30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17c40 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17c50 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
17c60 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
17c70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c90 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
17ca0 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20 56 64  TE_STOREP2);  Vd
17cb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17cc0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
17cd0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
17ce0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
17cf0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17d00 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17d10 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
17d20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17d30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17d40 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
17d50 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
17d60 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
17d70 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
17d80 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
17d90 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
17da0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
17db0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17dc0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
17dd0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17df0 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
17e00 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
17e10 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17e20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17e30 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
17e40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17e50 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
17e60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17e70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
17e80 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
17e90 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
17ea0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
17eb0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
17ec0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
17ed0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
17ee0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ef0 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
17f00 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
17f10 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
17f20 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
17f30 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
17f40 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
17f50 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
17f60 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
17f70 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
17f80 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
17f90 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
17fa0 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
17fb0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
17fc0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
17fd0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
17fe0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
17ff0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
18000 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
18010 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
18020 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
18030 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
18040 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
18050 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
18060 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
18070 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
18080 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
18090 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
180a0 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
180b0 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
180c0 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
180d0 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
180e0 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
180f0 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
18100 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
18110 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
18120 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
18130 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
18140 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
18150 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
18160 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
18170 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
18180 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
18190 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
181a0 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
181b0 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
181c0 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
181d0 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
181e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
181f0 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
18200 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
18210 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
18220 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
18230 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
18240 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
18250 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
18260 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
18270 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
18280 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
18290 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
182a0 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
182b0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
182c0 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
182d0 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
182e0 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
182f0 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
18300 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
18310 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
18320 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
18330 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
18340 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
18350 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
18360 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
18370 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
18380 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
18390 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
183a0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
183b0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
183c0 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
183d0 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
183e0 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
183f0 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
18400 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
18410 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
18420 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
18430 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
18440 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
18450 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
18460 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
18470 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
18480 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
18490 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
184a0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
184b0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
184c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
184d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
184e0 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
184f0 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
18500 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18510 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
18520 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
18530 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
18540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
18550 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
18560 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
18570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
18590 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
185a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
185b0 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
185c0 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
185d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
185e0 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
185f0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
18600 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
18610 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
18620 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
18630 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
18640 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
18650 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
18660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
18670 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
18680 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
18690 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
186a0 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
186b0 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
186c0 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
186d0 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
186e0 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
186f0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
18700 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20 20 2a   really real.  *
18710 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  /.      if( pExp
18720 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20  r->iColumn>=0 . 
18730 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61        && pTab->a
18740 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
18750 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  mn].affinity==SQ
18760 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
18770 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
18780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18790 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
187a0 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ity, target);.  
187b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
187c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
187d0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
187e0 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20  Form A:.    **  
187f0 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20   CASE x WHEN e1 
18800 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
18810 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
18820 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
18830 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
18840 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20    ** Form B:.   
18850 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
18860 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
18870 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57  e2 THEN r2 ... W
18880 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45  HEN eN THEN rN E
18890 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
188a0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69  .    ** Form A i
188b0 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f  s can be transfo
188c0 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71  rmed into the eq
188d0 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20  uivalent form B 
188e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
188f0 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78  **   CASE WHEN x
18900 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =e1 THEN r1 WHEN
18910 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e   x=e2 THEN r2 ..
18920 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ..    **        
18930 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72  WHEN x=eN THEN r
18940 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
18950 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66   **.    ** X (if
18960 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
18970 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
18980 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74      ** Y is in t
18990 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
189a0 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  of pExpr->x.pLis
189b0 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t if pExpr->x.pL
189c0 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20  ist->nExpr is.  
189d0 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59    ** odd.  The Y
189e0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
189f0 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65  l.  If the numbe
18a00 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
18a10 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20   x.pList.    ** 
18a20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20  is even, then Y 
18a30 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74  is omitted and t
18a40 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72  he "otherwise" r
18a50 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20  esult is NULL.. 
18a60 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
18a70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
18a80 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
18a90 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
18aa0 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
18ab0 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
18ac0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
18ad0 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
18ae0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
18af0 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
18b00 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
18b10 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
18b20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
18b30 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
18b40 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
18b50 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
18b60 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
18b70 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29  t( op==TK_CASE )
18b80 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ; {.      int en
18b90 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  dLabel;         
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
18bb0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e  OTO label for en
18bc0 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a  d of CASE stmt *
18bd0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74  /.      int next
18be0 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Case;           
18bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
18c00 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74  O label for next
18c10 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
18c20 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75          /* 2x nu
18c50 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72  mber of WHEN ter
18c60 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ms */.      int 
18c70 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18c90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18ca0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
18cb0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
18cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
18cd0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
18ce0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
18cf0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
18d00 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72  istelem;  /* Arr
18d10 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  ay of WHEN terms
18d20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f   */.      Expr o
18d30 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20  pCompare;       
18d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18d50 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73  he X==Ei express
18d60 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
18d70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d90 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
18da0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
18db0 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20   *pTest = 0;    
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18dd0 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
18de0 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
18df0 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41   B) */.      VVA
18e00 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68  _ONLY( int iCach
18e10 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  eLevel = pParse-
18e20 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a  >iCacheLevel; ).
18e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18e40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18e50 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18e60 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78  ect) && pExpr->x
18e70 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  .pList );.      
18e80 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e  assert(pExpr->x.
18e90 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
18ea0 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
18eb0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18ec0 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
18ed0 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
18ee0 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
18ef0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
18f00 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c    endLabel = sql
18f10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18f20 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
18f30 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  (pX = pExpr->pLe
18f40 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ft)!=0 ){.      
18f50 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20    tempX = *pX;. 
18f60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
18f70 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
18f80 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MN );.        ex
18f90 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65  prToRegister(&te
18fa0 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  mpX, sqlite3Expr
18fb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18fc0 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29   pX, &regFree1))
18fd0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18fe0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
18ff0 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  );.        opCom
19000 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
19010 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
19020 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70  re.pLeft = &temp
19030 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
19040 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
19050 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74         /* Ticket
19060 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31   b351d95f9cd5ef1
19070 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38  7e9d9dbae18f5ca8
19080 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20  611190001:.     
19090 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20     ** The value 
190a0 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68  in regFree1 migh
190b0 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69  t get SCopy-ed i
190c0 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73  nto the file res
190d0 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ult..        ** 
190e0 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  So make sure tha
190f0 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72  t the regFree1 r
19100 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72  egister is not r
19110 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a  eused for other.
19120 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f          ** purpo
19130 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ses and possibly
19140 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
19150 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65  /.        regFre
19160 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  e1 = 0;.      }.
19170 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19180 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29  <nExpr-1; i=i+2)
19190 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
191a0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
191b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
191c0 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
191d0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
191e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
191f0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
19200 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
19210 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
19220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19230 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
19240 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
19250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19260 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
19270 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19280 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
19290 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d  case( pTest->op=
192a0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
192b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
192c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
192d0 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65   pTest, nextCase
192e0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
192f0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ULL);.        te
19300 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
19310 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
19320 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
19330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19340 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
19350 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
19360 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
19370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19390 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29  to, 0, endLabel)
193a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
193b0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
193c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
193d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
193e0 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61  eLabel(v, nextCa
193f0 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
19400 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29     if( (nExpr&1)
19410 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
19420 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19430 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
19440 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19450 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
19460 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e  ist->a[nExpr-1].
19470 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
19480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19490 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
194a0 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se);.      }else
194b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
194c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
194d0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
194e0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
194f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
19500 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
19510 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20  arse->nErr>0 .  
19520 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
19530 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d  se->iCacheLevel=
19540 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a  =iCacheLevel );.
19550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19560 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
19570 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
19580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
195a0 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
195b0 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
195c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
195d0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
195e0 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20  E_Rollback .    
195f0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
19600 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
19610 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ort.           |
19620 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
19630 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  y==OE_Fail.     
19640 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
19650 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
19660 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ore.      );.   
19670 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
19680 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
19690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
196a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
196d0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
196e0 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
196f0 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
19700 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19710 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19720 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
19730 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
19740 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
19750 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
19760 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
19770 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
19780 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
19790 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
197a0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
197b0 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
197c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
197d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
197e0 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
197f0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
19800 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
19810 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
19820 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
19830 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19850 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
19860 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
19870 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
19880 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
198b0 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d  affinity, pExpr-
198c0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29  >u.zToken, 0, 0)
198d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
198e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
198f0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
19900 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19910 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
19920 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
19930 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19940 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
19950 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
19960 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f  ../*.** Factor o
19970 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74  ut the code of t
19980 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
19990 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ion to initializ
199a0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
199b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
199c0 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72  odeAtInit(.  Par
199d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
199e0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
199f0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
19a00 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  pr,      /* The 
19a10 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  expression to co
19a20 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45  de when the VDBE
19a30 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a   initializes */.
19a40 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20    int regDest,  
19a50 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
19a60 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
19a70 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20  egister */.  u8 
19a80 72 65 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f  reusable       /
19a90 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 65  * True if this e
19aa0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75  xpression is reu
19ab0 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  sable */.){.  Ex
19ac0 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73  prList *p;.  ass
19ad0 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72  ert( ConstFactor
19ae0 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20  Ok(pParse) );.  
19af0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
19b00 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20  stExpr;.  pExpr 
19b10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
19b20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
19b30 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71  pr, 0);.  p = sq
19b40 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
19b50 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70  end(pParse, p, p
19b60 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29  Expr);.  if( p )
19b70 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78  {.     struct Ex
19b80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
19b90 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45  em = &p->a[p->nE
19ba0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74  xpr-1];.     pIt
19bb0 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
19bc0 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20  Reg = regDest;. 
19bd0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61      pItem->reusa
19be0 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a  ble = reusable;.
19bf0 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43    }.  pParse->pC
19c00 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a  onstExpr = p;.}.
19c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19c20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
19c30 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   an expression a
19c40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
19c50 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72  ults.** into a r
19c60 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e  egister.  Return
19c70 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
19c80 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72  mber where the r
19c90 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74  esults.** are st
19ca0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
19cb0 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61  he register is a
19cc0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19cd0 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
19ce0 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20  deallocated,.** 
19cf0 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e  then write its n
19d00 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67  umber into *pReg
19d10 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
19d20 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
19d30 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c  .** a temporary,
19d40 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20   then set *pReg 
19d50 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  to zero..**.** I
19d60 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
19d70 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
19d80 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67   routine might g
19d90 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20  enerate this.** 
19da0 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  code to fill the
19db0 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
19dc0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
19dd0 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  section of the.*
19de0 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20  * VDBE program, 
19df0 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74  in order to fact
19e00 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65  or it out of the
19e10 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70   evaluation loop
19e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19e30 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
19e40 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
19e50 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
19e60 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20  eg){.  int r2;. 
19e70 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
19e80 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
19e90 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f  pExpr);.  if( Co
19ea0 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
19eb0 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  se).   && pExpr-
19ec0 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
19ed0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
19ee0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
19ef0 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a  oin(pExpr).  ){.
19f00 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20      ExprList *p 
19f10 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
19f20 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Expr;.    int i;
19f30 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b  .    *pReg  = 0;
19f40 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
19f50 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
19f60 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19f70 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d  .      for(pItem
19f80 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70  =p->a, i=p->nExp
19f90 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c  r; i>0; pItem++,
19fa0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69   i--){.        i
19fb0 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62  f( pItem->reusab
19fc0 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  le && sqlite3Exp
19fd0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
19fe0 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d  pExpr,pExpr,-1)=
19ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a000 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e  return pItem->u.
1a010 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20  iConstExprReg;. 
1a020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a030 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20  .    }.    r2 = 
1a040 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a050 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a060 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
1a070 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b  , pExpr, r2, 1);
1a080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a090 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
1a0a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1a0b0 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74  ;.    r2 = sqlit
1a0c0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1a0d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1a0e0 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d  r1);.    if( r2=
1a0f0 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  =r1 ){.      *pR
1a100 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c  eg = r1;.    }el
1a110 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1a120 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a130 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
1a140 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
1a150 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a160 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
1a170 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1a180 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
1a190 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
1a1a0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
1a1b0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1a1c0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
1a1d0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
1a1e0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
1a1f0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
1a200 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69  r target..*/.voi
1a210 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1a220 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1a230 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1a240 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
1a250 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
1a260 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
1a270 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
1a280 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78  Mem );.  if( pEx
1a290 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d  pr && pExpr->op=
1a2a0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
1a2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a2c0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1a2d0 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45  dbe, OP_Copy, pE
1a2e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
1a2f0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  get);.  }else{. 
1a300 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1a310 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1a320 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1a330 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73  target);.    ass
1a340 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1a350 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  be || pParse->db
1a360 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a370 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21  ;.    if( inReg!
1a380 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73  =target && pPars
1a390 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
1a3a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a3b0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1a3c0 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
1a3d0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1a3e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a3f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1a400 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
1a410 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1a420 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1a430 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1a440 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
1a450 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1a460 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
1a470 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
1a480 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20  ter target.  If 
1a490 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1a4a0 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  s constant, then
1a4b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1a4c0 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f   might choose to
1a4d0 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73   code the expres
1a4e0 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69  sion at initiali
1a4f0 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a  zation time..*/.
1a500 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a510 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50  CodeFactorable(P
1a520 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1a530 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1a540 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50  arget){.  if( pP
1a550 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
1a560 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78  tor && sqlite3Ex
1a570 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
1a580 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pr) ){.    sqlit
1a590 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1a5a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1a5b0 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65  target, 0);.  }e
1a5c0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1a5d0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1a5e0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1a5f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1a600 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1a610 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
1a620 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
1a630 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
1a640 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
1a650 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
1a660 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
1a670 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1a680 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
1a690 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
1a6a0 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
1a6b0 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
1a6c0 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
1a6d0 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
1a6e0 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
1a6f0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
1a700 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
1a710 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
1a720 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a730 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
1a740 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
1a750 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
1a760 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
1a770 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
1a780 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
1a790 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
1a7a0 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
1a7b0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1a7c0 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
1a7d0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
1a7e0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1a7f0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1a800 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1a810 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
1a820 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
1a830 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
1a840 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1a850 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
1a860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1a870 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1a880 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
1a890 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a8a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a8b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1a8c0 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
1a8d0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1a8e0 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
1a8f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1a900 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1a910 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
1a920 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
1a930 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e  -readable explan
1a940 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72  ation of an expr
1a950 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
1a960 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
1a970 61 69 6e 45 78 70 72 28 56 64 62 65 20 2a 70 4f  ainExpr(Vdbe *pO
1a980 75 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  ut, Expr *pExpr)
1a990 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  {.  int op;     
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9b0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1a9c0 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  g coded */.  con
1a9d0 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20  st char *zBinOp 
1a9e0 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79  = 0;   /* Binary
1a9f0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63   operator */.  c
1aa00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f  onst char *zUniO
1aa10 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72  p = 0;   /* Unar
1aa20 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  y operator */.  
1aa30 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
1aa40 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
1aa50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1aa60 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1aa70 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
1aa80 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1aa90 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
1aaa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1aab0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41  nPrintf(pOut, "A
1aac0 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20  GG{%d:%d}",.    
1aad0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1aae0 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  Table, pExpr->iC
1aaf0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
1ab00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ab10 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
1ab20 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1ab30 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
1ab40 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
1ab50 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1ab60 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
1ab70 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
1ab80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ab90 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1aba0 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20 70 45 78  COLUMN(%d)", pEx
1abb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1abc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1abd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1abe0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 7b  nPrintf(pOut, "{
1abf0 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1ac20 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
1ac30 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
1ac40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ac50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
1ac60 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
1ac70 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
1ac80 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
1ac90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aca0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1acb0 74 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e  t, "%d", pExpr->
1acc0 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  u.iValue);.     
1acd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ace0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1acf0 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 22 2c  intf(pOut, "%s",
1ad00 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1ad10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ad20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1ad30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ad40 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
1ad50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
1ad60 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AT: {.      sqli
1ad70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1ad80 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70  (pOut,"%s", pExp
1ad90 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1ada0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1adb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1adc0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1add0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ade0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1adf0 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1ae00 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1ae10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ae20 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
1ae30 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ae40 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 4e 55  nPrintf(pOut,"NU
1ae50 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
1ae60 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1ae70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
1ae80 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
1ae90 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
1aea0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1aeb0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25  inPrintf(pOut,"%
1aec0 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
1aed0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1aee0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1aef0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1af00 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
1af10 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1af20 74 66 28 70 4f 75 74 2c 22 56 41 52 49 41 42 4c  tf(pOut,"VARIABL
1af30 45 28 25 73 2c 25 64 29 22 2c 0a 20 20 20 20 20  E(%s,%d)",.     
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
1af60 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e 69 43  Token, pExpr->iC
1af70 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
1af80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1af90 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
1afa0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1afb0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1afc0 75 74 2c 22 52 45 47 49 53 54 45 52 28 25 64 29  ut,"REGISTER(%d)
1afd0 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
1afe0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1aff0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b000 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_AS: {.      sq
1b010 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b020 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1b030 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
1b040 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1b050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
1b060 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
1b070 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
1b080 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
1b090 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
1b0a0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
1b0b0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1b0c0 61 72 20 2a 7a 41 66 66 20 3d 20 22 75 6e 6b 22  ar *zAff = "unk"
1b0d0 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1b0e0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1b0f0 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1b100 6b 65 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ken, 0) ){.     
1b110 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1b120 46 46 5f 54 45 58 54 3a 20 20 20 20 7a 41 66 66  FF_TEXT:    zAff
1b130 20 3d 20 22 54 45 58 54 22 3b 20 20 20 20 20 62   = "TEXT";     b
1b140 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1b150 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
1b160 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 4e  NE:    zAff = "N
1b170 4f 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ONE";     break;
1b180 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1b190 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1b1a0 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d 45 52 49  : zAff = "NUMERI
1b1b0 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  C";  break;.    
1b1c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b1d0 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7a 41 66  AFF_INTEGER: zAf
1b1e0 66 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 20 20  f = "INTEGER";  
1b1f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1b200 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  ase SQLITE_AFF_R
1b210 45 41 4c 3a 20 20 20 20 7a 41 66 66 20 3d 20 22  EAL:    zAff = "
1b220 52 45 41 4c 22 3b 20 20 20 20 20 62 72 65 61 6b  REAL";     break
1b230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b240 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1b250 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 54  intf(pOut, "CAST
1b260 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b 0a 20 20  -%s(", zAff);.  
1b270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1b280 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1b290 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1b2a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b2b0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
1b2c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b2d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1b2e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1b2f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1b300 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  LT:      zBinOp 
1b310 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72 65 61  = "LT";     brea
1b320 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
1b330 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
1b340 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "LE";     break
1b350 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
1b360 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1b370 22 47 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "GT";     break;
1b380 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1b390 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1b3a0 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  GE";     break;.
1b3b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
1b3c0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4e       zBinOp = "N
1b3d0 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
1b3e0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
1b3f0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 45 51      zBinOp = "EQ
1b400 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1b410 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20    case TK_IS:   
1b420 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 22     zBinOp = "IS"
1b430 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1b440 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1b450 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53 4e 4f    zBinOp = "ISNO
1b460 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
1b470 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20  case TK_AND:    
1b480 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44 22 3b   zBinOp = "AND";
1b490 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1b4a0 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20  ase TK_OR:      
1b4b0 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b 20 20  zBinOp = "OR";  
1b4c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1b4d0 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a  se TK_PLUS:    z
1b4e0 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b 20 20  BinOp = "ADD";  
1b4f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1b500 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42  e TK_STAR:    zB
1b510 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20  inOp = "MUL";   
1b520 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1b530 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42 69   TK_MINUS:   zBi
1b540 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20  nOp = "SUB";    
1b550 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b560 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42 69 6e  TK_REM:     zBin
1b570 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 62  Op = "REM";    b
1b580 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b590 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69 6e 4f  K_BITAND:  zBinO
1b5a0 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 62 72  p = "BITAND"; br
1b5b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1b5c0 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e 4f 70  _BITOR:   zBinOp
1b5d0 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62 72 65   = "BITOR";  bre
1b5e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1b5f0 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f 70 20  SLASH:   zBinOp 
1b600 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72 65 61  = "DIV";    brea
1b610 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
1b620 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  SHIFT:  zBinOp =
1b630 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65 61 6b   "LSHIFT"; break
1b640 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
1b650 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  HIFT:  zBinOp = 
1b660 22 52 53 48 49 46 54 22 3b 20 62 72 65 61 6b 3b  "RSHIFT"; break;
1b670 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
1b680 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  CAT:  zBinOp = "
1b690 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b 3b 0a  CONCAT"; break;.
1b6a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
1b6b0 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  NUS:  zUniOp = "
1b6c0 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b 0a  UMINUS"; break;.
1b6d0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
1b6e0 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55  S:   zUniOp = "U
1b6f0 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a 20  PLUS";  break;. 
1b700 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
1b710 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42 49  T:  zUniOp = "BI
1b720 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TNOT"; break;.  
1b730 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
1b740 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54     zUniOp = "NOT
1b750 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1b760 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1b770 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e 55    zUniOp = "ISNU
1b780 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL"; break;.    
1b790 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1b7a0 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e 55   zUniOp = "NOTNU
1b7b0 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
1b7c0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
1b7d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b7e0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1b7f0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1b800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b810 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1b820 74 2c 22 2e 43 4f 4c 4c 41 54 45 28 25 73 29 22  t,".COLLATE(%s)"
1b830 2c 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  ,pExpr->u.zToken
1b840 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b850 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
1b860 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
1b870 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
1b880 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
1b890 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
1b8a0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1b8b0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1b8c0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nts */.      if(
1b8d0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1b8e0 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
1b8f0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
1b900 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20   pFarg = 0;.    
1b910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b920 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e   pFarg = pExpr->
1b930 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d  x.pList;.      }
1b940 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
1b950 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1b960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b970 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b980 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e 43 54 49  Out, "AGG_FUNCTI
1b990 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20 20 20 20  ON%d:%s(",.     
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1b9c0 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  p2, pExpr->u.zTo
1b9d0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1b9e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1b9f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1ba00 70 4f 75 74 2c 20 22 46 55 4e 43 54 49 4f 4e 3a  pOut, "FUNCTION:
1ba10 25 73 28 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  %s(", pExpr->u.z
1ba20 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Token);.      }.
1ba30 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
1ba40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ba50 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1ba60 74 28 70 4f 75 74 2c 20 70 46 61 72 67 29 3b 0a  t(pOut, pFarg);.
1ba70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1ba80 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ba90 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1baa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bab0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1bac0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1bad0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
1bae0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1baf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1bb00 70 4f 75 74 2c 20 22 45 58 49 53 54 53 28 22 29  pOut, "EXISTS(")
1bb10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bb20 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
1bb30 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1bb40 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
1bb50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bb60 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  (pOut,")");.    
1bb70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bb80 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
1bb90 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1bba0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1bbb0 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20 20 20 20  pOut, "(");.    
1bbc0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1bbd0 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78  Select(pOut, pEx
1bbe0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
1bbf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bc00 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bc10 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1bc20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1bc30 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1bc40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1bc50 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 49 4e  Printf(pOut, "IN
1bc60 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1bc70 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1bc80 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1bc90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bca0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1bcb0 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
1bcc0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1bcd0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1bce0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1bcf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bd00 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70  inSelect(pOut, p
1bd10 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
1bd20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bd30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1bd40 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1bd50 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ut, pExpr->x.pLi
1bd60 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
1bd70 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bd80 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1bd90 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1bda0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1bdb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1bdc0 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
1bdd0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1bde0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1bdf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1be00 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1be10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1be20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1be30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1be40 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1be50 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1be60 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1be70 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1be80 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1be90 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1bea0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1beb0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1bec0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1bed0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
1bee0 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d  xpr *pX = pExpr-
1bef0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
1bf00 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e  pr *pY = pExpr->
1bf10 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
1bf20 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1bf30 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pZ = pExpr->x.p
1bf40 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1bf50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bf60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bf70 74 2c 20 22 42 45 54 57 45 45 4e 28 22 29 3b 0a  t, "BETWEEN(");.
1bf80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bf90 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1bfa0 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  X);.      sqlite
1bfb0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1bfc0 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  Out, ",");.     
1bfd0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1bfe0 78 70 72 28 70 4f 75 74 2c 20 70 59 29 3b 0a 20  xpr(pOut, pY);. 
1bff0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c000 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c010 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1c020 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1c030 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20 20 20 20  Out, pZ);.      
1c040 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c050 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b  intf(pOut, ")");
1c060 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c070 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c080 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
1c090 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1c0a0 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
1c0b0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1c0c0 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
1c0d0 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
1c0e0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
1c0f0 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
1c100 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
1c110 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
1c120 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
1c130 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
1c140 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
1c150 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
1c160 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
1c170 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
1c180 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
1c190 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
1c1a0 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
1c1b0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
1c1c0 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
1c1d0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
1c1e0 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
1c1f0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1c200 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
1c210 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1c220 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c230 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73  Printf(pOut, "%s
1c240 28 25 64 29 22 2c 20 0a 20 20 20 20 20 20 20 20  (%d)", .        
1c250 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1c260 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c 44 22 2c  ? "NEW" : "OLD",
1c270 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1c280 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c290 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c2a0 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73  _CASE: {.      s
1c2b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c2c0 6e 74 66 28 70 4f 75 74 2c 20 22 43 41 53 45 28  ntf(pOut, "CASE(
1c2d0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1c2e0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1c2f0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1c300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c310 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c320 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1c330 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1c340 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70  rList(pOut, pExp
1c350 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1c360 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c380 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
1c390 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
1c3a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1c3b0 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22  r *zType = "unk"
1c3c0 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  ;.      switch( 
1c3d0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
1c3e0 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
1c3f0 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a  OE_Rollback:   z
1c400 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b  Type = "rollback
1c410 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
1c420 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74     case OE_Abort
1c430 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  :      zType = "
1c440 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61  abort";     brea
1c450 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1c460 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a  OE_Fail:       z
1c470 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20  Type = "fail";  
1c480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c490 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
1c4a0 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  e:     zType = "
1c4b0 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61  ignore";    brea
1c4c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c4d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c4e0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 52 41 49  rintf(pOut, "RAI
1c4f0 53 45 2d 25 73 28 25 73 29 22 2c 20 7a 54 79 70  SE-%s(%s)", zTyp
1c500 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  e, pExpr->u.zTok
1c510 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1c520 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c530 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20   }.  if( zBinOp 
1c540 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1c550 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c560 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f 70 29 3b  ,"%s(", zBinOp);
1c570 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c580 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1c590 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c5a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c5b0 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c 22 29 3b  rintf(pOut,",");
1c5c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1c5d0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1c5e0 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1c5f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c600 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29  Printf(pOut,")")
1c610 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 55  ;.  }else if( zU
1c620 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  niOp ){.    sqli
1c630 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c640 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 55 6e  (pOut,"%s(", zUn
1c650 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iOp);.    sqlite
1c660 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1c670 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1c680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1c690 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c6a0 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ")");.  }.}.#end
1c6b0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1c6c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
1c6d0 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69  _EXPLAIN) */..#i
1c6e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c6f0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
1c700 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
1c710 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
1c720 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f  dable explanatio
1c730 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  n of an expressi
1c740 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
1c750 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c760 78 70 72 4c 69 73 74 28 56 64 62 65 20 2a 70 4f  xprList(Vdbe *pO
1c770 75 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  ut, ExprList *pL
1c780 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1c790 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
1c7a0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
1c7b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1c7c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c7d0 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69 73 74 29  t, "(empty-list)
1c7e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
1c7f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73    }else if( pLis
1c800 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20  t->nExpr==1 ){. 
1c810 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c820 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69 73  nExpr(pOut, pLis
1c830 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
1c840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1c850 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
1c860 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  pOut);.    for(i
1c870 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1c880 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1c890 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c8a0 69 6e 74 66 28 70 4f 75 74 2c 20 22 69 74 65 6d  intf(pOut, "item
1c8b0 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b 0a 20 20  [%d] = ", i);.  
1c8c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c8d0 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20  inPush(pOut);.  
1c8e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c8f0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 4c 69  inExpr(pOut, pLi
1c900 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1c910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c920 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a  plainPop(pOut);.
1c930 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1c940 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
1c950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c960 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c970 2c 20 22 20 41 53 20 25 73 22 2c 20 70 4c 69 73  , " AS %s", pLis
1c980 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1c990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c9a0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53  ( pList->a[i].bS
1c9b0 70 61 6e 49 73 54 61 62 20 29 7b 0a 20 20 20 20  panIsTab ){.    
1c9c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c9d0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c9e0 20 28 25 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61   (%s)", pList->a
1c9f0 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
1ca00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
1ca10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29  pList->nExpr-1 )
1ca20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ca30 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f 75 74 29  3ExplainNL(pOut)
1ca40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ca50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ca60 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 7d  inPop(pOut);.  }
1ca70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1ca80 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
1ca90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1caa0 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
1cab0 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
1cac0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1cad0 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
1cae0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
1caf0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
1cb00 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
1cb10 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
1cb20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1cb30 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
1cb40 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  valuated..**.** 
1cb50 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
1cb60 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
1cb70 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
1cb80 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
1cb90 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
1cba0 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
1cbb0 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
1cbc0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
1cbd0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
1cbe0 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
1cbf0 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
1cc00 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
1cc10 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
1cc20 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
1cc30 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
1cc40 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1cc50 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
1cc60 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
1cc70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1cc80 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1cc90 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
1cca0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
1ccb0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1ccc0 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
1ccd0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
1cce0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38   results */.  u8
1ccf0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1cd00 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   /* SQLITE_ECEL_
1cd10 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
1cd20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1cd30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1cd40 6e 74 20 69 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  nt i, n;.  u8 co
1cd50 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
1cd60 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
1cd70 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
1cd80 53 43 6f 70 79 3b 0a 20 20 61 73 73 65 72 74 28  SCopy;.  assert(
1cd90 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
1cda0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1cdb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1cdc0 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
1cdd0 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
1cde0 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
1cdf0 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
1ce00 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
1ce10 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
1ce20 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
1ce30 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
1ce40 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
1ce50 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1ce60 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
1ce70 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
1ce80 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
1ce90 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
1cea0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
1ceb0 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26  EL_FACTOR)!=0 &&
1cec0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1ced0 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
1cee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cef0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
1cf00 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1cf10 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65  et+i, 0);.    }e
1cf20 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1cf30 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1cf40 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1cf50 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1cf60 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28  et+i);.      if(
1cf70 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69   inReg!=target+i
1cf80 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
1cf90 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
1cfa0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1cfb0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20  e->pVdbe;.      
1cfc0 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
1cfd0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
1cfe0 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
1cff0 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
1d000 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
1d010 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
1d020 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
1d030 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
1d040 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
1d050 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
1d060 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1d070 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
1d080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d0a0 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
1d0b0 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
1d0c0 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
1d0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d0e0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
1d0f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d100 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
1d110 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
1d120 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
1d130 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
1d140 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
1d150 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
1d160 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1d170 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
1d180 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
1d190 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
1d1a0 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
1d1b0 6f 6e 0a 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69  on.** elementati
1d1c0 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74  on of x..*/.stat
1d1d0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
1d1e0 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
1d1f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1d200 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
1d210 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
1d220 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
1d230 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
1d240 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
1d250 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
1d260 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1d270 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
1d280 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f  jump is taken */
1d290 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75  .  int jumpIfTru
1d2a0 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  e,   /* Take the
1d2b0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
1d2c0 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a  WEEN is true */.
1d2d0 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c    int jumpIfNull
1d2e0 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20      /* Take the 
1d2f0 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
1d300 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  EEN is NULL */.)
1d310 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64  {.  Expr exprAnd
1d320 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44  ;     /* The AND
1d330 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e   operator in  x>
1d340 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a  =y AND x<=z  */.
1d350 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
1d360 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79      /* The  x>=y
1d370 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
1d380 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a   compRight;   /*
1d390 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d   The  x<=z  term
1d3a0 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58   */.  Expr exprX
1d3b0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20  ;       /* The  
1d3c0 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  x  subexpression
1d3d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
1d3e0 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f  e1 = 0; /* Tempo
1d3f0 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
1d400 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
1d410 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d420 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1d430 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58  lect) );.  exprX
1d440 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
1d450 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d  ;.  exprAnd.op =
1d460 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41   TK_AND;.  exprA
1d470 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
1d480 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
1d490 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
1d4a0 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  ght;.  compLeft.
1d4b0 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f  op = TK_GE;.  co
1d4c0 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26  mpLeft.pLeft = &
1d4d0 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66  exprX;.  compLef
1d4e0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
1d4f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
1d500 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67  pExpr;.  compRig
1d510 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
1d520 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74   compRight.pLeft
1d530 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
1d540 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20  pRight.pRight = 
1d550 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1d560 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78  a[1].pExpr;.  ex
1d570 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
1d580 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  prX, sqlite3Expr
1d590 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1d5a0 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
1d5b0 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70  e1));.  if( jump
1d5c0 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71  IfTrue ){.    sq
1d5d0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1d5e0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1d5f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1d600 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
1d610 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1d620 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
1d630 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1d640 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
1d650 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1d660 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1d670 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45  gFree1);..  /* E
1d680 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74  nsure adequate t
1d690 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a  est coverage */.
1d6a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d6b0 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1d6c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1d6d0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1d6e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d6f0 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1d700 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d710 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1d720 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d730 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1d740 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1d750 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1d760 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d770 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d780 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1d790 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d7a0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1d7b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d7c0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1d7d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d7e0 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1d7f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1d800 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1d810 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d820 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1d830 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d840 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1d850 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d860 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1d870 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1d880 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=0 );.}../*.**
1d890 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1d8a0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1d8b0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1d8c0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1d8d0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1d8e0 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1d8f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1d900 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1d910 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1d920 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1d930 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d940 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
1d950 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1d960 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1d970 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1d980 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
1d990 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1d9a0 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
1d9b0 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54  ll flag is SQLIT
1d9c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a  E_JUMPIFNULL..**
1d9d0 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
1d9e0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1d9f0 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
1da00 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
1da10 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
1da20 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
1da30 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
1da40 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
1da50 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
1da60 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
1da70 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
1da80 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
1da90 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
1daa0 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
1dab0 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
1dac0 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
1dad0 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
1dae0 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
1daf0 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
1db00 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1db10 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
1db20 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
1db30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1db40 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
1db50 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1db60 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1db70 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1db80 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1db90 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1dba0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1dbb0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1dbc0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1dbd0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1dbe0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1dbf0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1dc00 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1dc10 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1dc20 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1dc30 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
1dc40 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
1dc50 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1dc60 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ller */.  if( NE
1dc70 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20  VER(pExpr==0) ) 
1dc80 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77  return;  /* No w
1dc90 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
1dca0 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78  en */.  op = pEx
1dcb0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
1dcc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1dcd0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1dce0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1dcf0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1dd00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1dd10 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1dd20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1dd30 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1dd40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1dd50 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
1dd60 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1dd70 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1dd80 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1dd90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1dda0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1ddb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ddc0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1ddd0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1dde0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ddf0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
1de00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1de10 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1de20 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1de30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1de40 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74  TK_OR: {.      t
1de50 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1de60 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1de70 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1de80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1de90 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1dea0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1deb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1dec0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1ded0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dee0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1def0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1df00 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1df10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1df20 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1df30 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1df40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1df50 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1df60 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1df70 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1df80 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1df90 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1dfa0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1dfb0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1dfc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dfd0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
1dfe0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
1dff0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
1e000 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
1e010 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
1e020 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
1e030 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e040 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e050 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e060 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e070 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e080 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e090 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
1e0a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e0b0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e0c0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
1e0d0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
1e0e0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1e0f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1e100 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1e110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e120 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1e130 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e140 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1e150 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1e160 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1e170 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e180 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1e190 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
1e1a0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
1e1b0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
1e1c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e1d0 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
1e1e0 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
1e1f0 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
1e200 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
1e210 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1e220 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
1e230 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1e240 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1e250 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1e260 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e270 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
1e280 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
1e290 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1e2a0 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
1e2b0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
1e2c0 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q);.      assert
1e2d0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
1e2e0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e2f0 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
1e300 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
1e310 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e320 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e330 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e340 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1e350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e360 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1e370 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
1e380 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
1e390 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1e3a0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1e3b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
1e3c0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1e3d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e3e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e3f0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e400 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1e410 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e420 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e430 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1e440 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1e450 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
1e460 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
1e470 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1e480 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e490 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1e4a0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1e4c0 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
1e4d0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1e4e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e4f0 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20  v, op==TK_EQ);. 
1e500 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1e510 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45  eIf(v, op==TK_NE
1e520 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e530 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1e540 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e550 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1e560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e580 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1e590 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1e5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e5b0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1e5c0 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
1e5d0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1e5e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e5f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1e600 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
1e610 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1e620 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
1e630 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e640 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e650 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1e660 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1e670 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e680 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1e690 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1e6a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1e6b0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
1e6c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e6d0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1e6e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e6f0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1e700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e710 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e720 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1e730 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e740 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e750 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1e760 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1e770 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66   dest, 1, jumpIf
1e780 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1e790 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1e7a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1e7b0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1e7c0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1e7d0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
1e7e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1e7f0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1e800 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
1e810 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
1e820 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65  st : destIfFalse
1e830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e840 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1e850 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
1e860 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
1e870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e890 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
1e8a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e8b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1e8c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
1e8d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e8e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
1e8f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
1e900 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
1e910 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
1e920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e930 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1e940 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
1e950 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
1e960 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
1e970 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
1e980 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   No-op */.      
1e990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1e9a0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1e9b0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1e9c0 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
1e9d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e9e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e9f0 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
1ea00 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
1ea10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
1ea20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1ea30 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ea40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ea50 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ea60 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ea70 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ea80 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
1ea90 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1eaa0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1eab0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1eac0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ead0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1eae0 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  );  .}../*.** Ge
1eaf0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1eb00 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1eb10 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1eb20 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1eb30 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1eb40 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1eb50 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
1eb60 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
1eb70 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
1eb80 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
1eb90 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1eba0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
1ebb0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1ebc0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1ebd0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1ebe0 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
1ebf0 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
1ec00 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  l is SQLITE_JUMP
1ec10 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74  IFNULL or fall t
1ec20 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
1ec30 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f  Null.** is 0..*/
1ec40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ec50 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
1ec60 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ec70 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1ec80 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1ec90 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1eca0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ecb0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1ecc0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1ecd0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1ece0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1ecf0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1ed00 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1ed10 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1ed20 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1ed30 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1ed40 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74  return; /* Exist
1ed50 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
1ed60 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1ed70 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  /.  if( pExpr==0
1ed80 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20   )    return;.. 
1ed90 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1eda0 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
1edb0 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
1edc0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1edd0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
1ede0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
1edf0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
1ee00 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
1ee10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
1ee20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
1ee30 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
1ee40 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1ee50 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
1ee60 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
1ee70 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
1ee80 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
1ee90 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1eeb0 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
1eec0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
1eed0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
1eee0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
1eef0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
1ef00 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
1ef10 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
1ef20 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1ef40 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
1ef50 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
1ef60 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
1ef70 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
1ef80 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
1ef90 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
1efa0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1efb0 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
1efc0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
1efd0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
1efe0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
1eff0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
1f000 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
1f010 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
1f020 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
1f030 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
1f040 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
1f050 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
1f060 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
1f070 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
1f080 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
1f090 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
1f0a0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1f0b0 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
1f0c0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f0d0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
1f0e0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
1f0f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f100 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
1f110 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
1f120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f130 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
1f140 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
1f150 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f160 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
1f170 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
1f180 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f190 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
1f1a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f1b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
1f1c0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
1f1d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f1e0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
1f1f0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
1f200 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f210 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
1f220 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
1f230 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
1f240 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1f250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f260 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f280 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f290 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f2a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f2b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f2c0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1f2d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1f2e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1f2f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f300 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1f310 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f320 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f330 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1f340 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f350 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1f360 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1f370 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f380 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f390 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f3a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f3b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1f3c0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1f3d0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
1f3e0 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1f3f0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f400 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f410 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f420 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f430 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1f440 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f450 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f470 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f480 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1f490 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f4a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1f4b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f4c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1f4d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f4e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1f4f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f500 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1f510 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f520 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f530 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f540 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f550 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1f560 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1f570 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1f580 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1f590 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1f5a0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1f5b0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f5c0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f5d0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f5e0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f5f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f600 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f610 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f620 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f630 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f640 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f650 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f660 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f670 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f680 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f690 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f6a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f6b0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
1f6c0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f6d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f6e0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1f6f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1f700 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f710 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1f720 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f730 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f740 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1f750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1f760 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1f770 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1f780 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1f790 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1f7a0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1f7b0 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1f7c0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1f7d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f7e0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1f7f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1f800 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1f810 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1f820 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1f830 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1f840 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1f850 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1f860 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1f870 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1f880 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ne);.      t
1f890 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f8a0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f8b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f8c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f8d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f8e0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1f8f0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1f900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f910 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1f920 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f930 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1f940 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1f950 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f960 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f970 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f980 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f990 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f9a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f9b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f9c0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f9d0 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e     op = (pExpr->
1f9e0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
1f9f0 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20  NE : TK_EQ;.    
1fa00 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1fa10 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fa20 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1fa30 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1fa40 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1fa50 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55   dest, SQLITE_NU
1fa60 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
1fa70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1fa80 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20  p==TK_EQ);.     
1fa90 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1faa0 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20  v, op==TK_NE);. 
1fab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1fac0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1fad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fae0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1faf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fb00 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1fb10 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1fb20 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1fb30 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fb40 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fb50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fb60 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fb70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fb80 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1fb90 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
1fba0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1fbb0 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76  ULL );   VdbeCov
1fbc0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1fbd0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1fbe0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fbf0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64  K_NOTNULL );  Vd
1fc00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1fc10 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
1fc20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fc30 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1fc40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fc50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1fc60 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1fc70 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1fc80 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1fc90 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1fca0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1fcb0 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  dest, 0, jumpIfN
1fcc0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1fcd0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1fce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1fcf0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
1fd00 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
1fd10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
1fd20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fd30 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
1fd40 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
1fd50 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1fd60 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
1fd70 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
1fd80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fd90 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
1fda0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1fdb0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1fdc0 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
1fdd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fde0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1fdf0 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
1fe00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1fe10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1fe20 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1fe30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  {.      if( expr
1fe40 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
1fe50 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
1fe60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1fe70 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1fe80 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
1fe90 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
1fea0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
1feb0 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
1fec0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
1fed0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1fee0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1fef0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ff00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ff10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ff20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
1ff30 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
1ff40 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1ff50 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ff60 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
1ff70 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ff80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
1ff90 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1ffa0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1ffb0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1ffc0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1ffd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1ffe0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1fff0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
20000 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20010 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
20020 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
20030 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
20040 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
20050 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
20060 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
20070 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
20080 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
20090 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
200a0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
200b0 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
200c0 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
200d0 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
200e0 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
200f0 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
20100 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
20110 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
20120 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
20130 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
20140 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
20150 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
20160 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
20170 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
20180 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
20190 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
201a0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
201b0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
201c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
201d0 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
201e0 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
201f0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
20200 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
20210 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
20220 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
20230 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
20240 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
20250 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
20260 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
20270 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
20280 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
20290 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
202a0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
202b0 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
202c0 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
202d0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
202e0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
202f0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
20300 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
20310 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
20320 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
20330 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
20340 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
20350 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
20360 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
20370 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
20380 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
20390 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
203a0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
203b0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
203c0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
203d0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
203e0 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
203f0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
20400 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
20410 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
20420 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
20430 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
20440 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
20450 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
20460 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
20470 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
20480 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
20490 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
204a0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
204b0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
204c0 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
204d0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
204e0 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
204f0 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
20500 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
20510 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
20520 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
20530 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
20540 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
20550 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
20560 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
20570 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
20580 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
20590 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
205a0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
205b0 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
205c0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
205d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
205e0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
205f0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
20600 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
20610 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
20620 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
20630 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
20640 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
20650 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20660 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
20670 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
20680 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
20690 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
206a0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
206b0 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
206c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
206d0 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
206e0 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
206f0 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70  LUMN && ALWAYS(p
20700 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  A->op!=TK_AGG_CO
20710 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a  LUMN) && pA->u.z
20720 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
20730 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
20740 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
20750 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
20760 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
20770 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
20780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
20790 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
207a0 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
207b0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
207c0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
207d0 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
207e0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
207f0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
20800 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
20810 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
20820 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
20830 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
20840 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20850 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
20860 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
20870 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
20880 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
20890 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
208a0 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
208b0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
208c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
208d0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
208e0 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
208f0 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
20900 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
20910 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
20920 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
20930 75 63 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20  uced)==0) ){.   
20940 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
20950 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
20960 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20970 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
20980 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
20990 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
209a0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
209b0 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
209c0 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
209d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
209e0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
209f0 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
20a00 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
20a10 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
20a20 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
20a30 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
20a40 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
20a50 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
20a60 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
20a70 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
20a80 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
20a90 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
20aa0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
20ab0 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
20ac0 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
20ad0 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
20ae0 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
20af0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
20b00 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
20b10 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
20b20 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
20b30 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
20b40 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
20b50 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
20b60 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
20b70 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
20b80 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
20b90 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
20ba0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
20bb0 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
20bc0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
20bd0 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
20be0 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
20bf0 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
20c00 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
20c10 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
20c20 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
20c30 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
20c40 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
20c50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
20c60 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
20c70 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
20c80 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
20c90 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
20ca0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
20cb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20cc0 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
20cd0 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
20ce0 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
20cf0 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
20d00 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
20d10 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
20d20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
20d30 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
20d40 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
20d50 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
20d60 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
20d70 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
20d80 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
20d90 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
20da0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
20db0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20dc0 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  e(pExprA, pExprB
20dd0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
20de0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
20df0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
20e00 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 63  urn true if we c
20e10 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45 32  an prove the pE2
20e20 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
20e30 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a  true if pE1 is.*
20e40 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20  * true.  Return 
20e50 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e  false if we cann
20e60 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  ot complete the 
20e70 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20  proof or if pE2 
20e80 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73  might.** be fals
20e90 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  e.  Examples:.**
20ea0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d  .**     pE1: x==
20eb0 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d  5       pE2: x==
20ec0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
20ed0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
20ee0 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20    pE1: x>0      
20ef0 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
20f00 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
20f10 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
20f20 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45 32  : x=21       pE2
20f30 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20  : x=21 OR y=43  
20f40 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
20f50 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31  **     pE1: x!=1
20f60 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  23     pE2: x IS
20f70 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
20f80 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
20f90 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20   pE1: x!=?1     
20fa0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
20fb0 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
20fc0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
20fd0 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20  x IS NULL  pE2: 
20fe0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
20ff0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
21000 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
21010 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53 20  ?2    pE2: x IS 
21020 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73  NOT NULL    Reus
21030 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20  lt: false.**.** 
21040 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54  When comparing T
21050 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62  K_COLUMN nodes b
21060 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70  etween pE1 and p
21070 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a  E2, if pE2 has.*
21080 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20  * Expr.iTable<0 
21090 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61  then assume a ta
210a0 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e  ble number given
210b0 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   by iTab..**.** 
210c0 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
210d0 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
210e0 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
210f0 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
21100 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
21110 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
21120 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
21130 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
21140 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
21150 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
21160 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
21170 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
21180 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
21190 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
211a0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
211b0 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  r(Expr *pE1, Exp
211c0 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
211d0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
211e0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c  ExprCompare(pE1,
211f0 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29   pE2, iTab)==0 )
21200 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21210 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
21220 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28  p==TK_OR.   && (
21230 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
21240 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d  esExpr(pE1, pE2-
21250 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
21260 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
21270 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
21280 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
21290 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20  Right, iTab) ). 
212a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
212b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
212c0 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
212d0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
212e0 72 43 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c  rCompare(pE1->pL
212f0 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  eft, pE2->pLeft,
21300 20 69 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20   iTab)==0.   && 
21310 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  (pE1->op!=TK_ISN
21320 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
21330 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20  TK_IS).  ){.    
21340 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21350 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21360 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
21370 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
21380 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
21390 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
213a0 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
213b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
213c0 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
213d0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
213e0 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
213f0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
21400 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
21410 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
21420 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
21430 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
21440 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
21450 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
21460 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
21470 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
21480 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
21490 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
214a0 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
214b0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
214c0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
214d0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
214e0 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
214f0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
21500 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
21510 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
21520 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
21530 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
21540 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
21550 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
21560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
21570 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
21580 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
21590 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
215a0 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
215b0 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
215c0 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
215d0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
215e0 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
215f0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
21600 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
21610 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
21620 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
21630 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
21640 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
21650 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
21660 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
21670 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
21680 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
21690 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
216a0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
216b0 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
216c0 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
216d0 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
216e0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
216f0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
21700 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
21710 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
21720 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
21730 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
21740 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
21750 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
21760 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
21770 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
21780 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
21790 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
217a0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
217b0 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
217c0 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
217d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
217e0 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  pSrc->nSrc ){.  
217f0 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
21800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21810 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
21820 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21830 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
21840 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
21850 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
21860 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
21870 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
21880 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
21890 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
218a0 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
218b0 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
218c0 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
218d0 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
218e0 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
218f0 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
21900 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
21910 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
21920 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
21930 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
21940 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
21950 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
21960 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
21970 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
21980 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
21990 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
219a0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
219b0 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
219c0 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
219d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
219e0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
219f0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
21a00 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
21a10 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
21a20 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
21a30 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
21a40 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
21a50 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
21a60 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
21a70 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
21a80 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
21a90 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
21aa0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
21ab0 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
21ac0 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
21ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
21ae0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
21af0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
21b00 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
21b10 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
21b20 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
21b30 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
21b40 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
21b50 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
21b60 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
21b70 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
21b80 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
21b90 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
21ba0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
21bb0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
21bc0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
21bd0 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
21be0 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
21bf0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
21c00 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
21c10 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
21c20 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
21c30 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
21c40 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
21c50 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
21c60 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
21c70 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
21c80 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
21c90 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
21ca0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
21cb0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
21cc0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
21cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
21ce0 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
21cf0 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
21d00 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
21d10 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
21d20 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
21d30 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
21d40 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
21d50 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
21d60 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
21d70 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
21d80 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
21d90 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
21da0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
21db0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
21dc0 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
21dd0 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
21de0 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
21df0 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
21e00 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
21e10 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
21e20 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
21e30 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
21e40 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
21e50 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
21e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21e70 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
21e80 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
21e90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
21ea0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
21eb0 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
21ec0 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
21ed0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
21ee0 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
21ef0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
21f00 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
21f10 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
21f20 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
21f30 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
21f40 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
21f50 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
21f60 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
21f70 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
21f80 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
21f90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
21fa0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
21fb0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
21fc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
21fd0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
21fe0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
21ff0 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
22000 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
22010 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
22020 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
22030 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
22040 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
22050 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
22060 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
22070 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22080 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
22090 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
220a0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
220b0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
220c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
220d0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
220e0 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
220f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
22100 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22110 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
22120 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
22130 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22140 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
22150 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
22160 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22170 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22180 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
22190 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
221a0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
221b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
221c0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
221d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
221e0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
221f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
22200 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22210 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
22220 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
22230 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
22240 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
22250 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
22260 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
22270 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
22280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22290 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
222a0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
222b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
222c0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
222d0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
222e0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
222f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22300 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
22310 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
22320 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
22330 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
22340 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
22350 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
22360 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22380 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
223a0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
223b0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
223c0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
223d0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
223e0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
223f0 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
22400 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22410 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
22420 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
22430 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22440 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
22450 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
22460 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
22470 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
22480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22490 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
224a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
224c0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
224d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
224e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
224f0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
22500 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
22510 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
22520 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22530 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
22540 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
22560 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
22570 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
22580 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
22590 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
225a0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
225b0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
225c0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
225d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
225e0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
225f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22600 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
22610 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
22640 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
22650 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22660 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
22670 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
22680 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
22690 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
226a0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
226b0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
226c0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
226d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
226e0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
226f0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
22700 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22750 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
22760 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
22790 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
227a0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
227b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
227c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
227d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
227e0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
227f0 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
22800 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
22810 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
22820 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
22830 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
22840 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
22850 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
22860 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
22870 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
22880 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
22890 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
228a0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
228b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
228c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
228d0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
228e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
228f0 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
22900 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
22910 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
22920 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
22930 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
22940 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
22950 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
22960 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
22970 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
22980 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
22990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
229a0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
229b0 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
229c0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
229d0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
229e0 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
229f0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
22a00 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
22a10 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
22a20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
22a30 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
22a40 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
22a50 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
22a60 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
22a70 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
22a80 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
22a90 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
22aa0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
22ab0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
22ac0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
22ad0 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
22ae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
22af0 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
22b00 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
22b10 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
22b20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22b30 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
22b40 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
22b50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
22b60 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
22b70 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
22b80 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
22b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
22ba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22bb0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
22bc0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
22bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
22be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22bf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22c00 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
22c10 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
22c20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
22c30 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
22c40 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
22c50 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
22c60 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
22c70 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
22c80 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
22c90 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
22ca0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
22cb0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
22cc0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
22cd0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
22cf0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
22d00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
22d10 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
22d20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
22d30 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
22d40 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
22d50 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
22d60 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
22d70 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
22d80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
22da0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22db0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22dc0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
22dd0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22de0 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
22df0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
22e00 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
22e10 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
22e20 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c  r->u.zToken, sql
22e30 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
22e40 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20  pr->u.zToken),. 
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
22e70 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
22e80 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
22e90 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
22ea0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
22eb0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
22ec0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
22ed0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
22ee0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
22ef0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
22f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22f10 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
22f20 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
22f30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22f50 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
22f60 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
22f70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
22f80 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22f90 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
22fa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
22fb0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
22fc0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
22fd0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
22fe0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
22ff0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
23000 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
23010 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
23020 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
23030 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
23040 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
23050 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
23060 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
23070 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
23080 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23090 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
230a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
230b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
230c0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
230d0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
230e0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
230f0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
23100 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
23110 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23120 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20  TER(pWalker);.  
23130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23140 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  (pSelect);.  ret
23150 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
23170 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
23180 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
23190 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
231a0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
231b0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
231c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
231d0 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
231e0 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
231f0 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
23200 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
23210 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
23220 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
23230 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
23240 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
23250 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
23260 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
23270 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
23280 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
23290 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
232a0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
232b0 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
232c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
232d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
232e0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
232f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
23300 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
23310 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
23320 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
23330 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
23340 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
23350 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
23360 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
23370 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
23380 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
23390 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
233a0 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
233b0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
233c0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
233d0 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
233e0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
233f0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
23400 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23410 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
23420 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
23430 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
23440 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
23450 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
23460 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
23470 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
23480 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
23490 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
234a0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
234b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
234c0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
234d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
234e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
234f0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
23500 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
23510 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
23520 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
23530 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
23540 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
23550 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
23560 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
23570 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23580 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
23590 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
235a0 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
235b0 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
235c0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
235d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
235e0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
235f0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
23600 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
23610 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
23620 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
23630 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
23640 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
23650 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
23660 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
23670 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
23680 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
23690 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
236a0 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
236b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
236c0 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
236d0 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
236e0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
236f0 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
23700 64 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  dallocation is d
23710 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
23720 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
23730 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
23740 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
23750 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
23760 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
23770 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
23780 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
23790 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
237a0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
237b0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
237c0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
237d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
237e0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
237f0 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
23800 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
23810 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
23820 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
23830 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
23840 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
23850 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
23860 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
23870 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
23880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
23890 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
238a0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
238b0 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
238c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
238d0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
238e0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
238f0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
23900 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
23910 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
23920 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
23930 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
23940 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
23950 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
23960 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
23970 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
23980 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
23990 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
239a0 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
239b0 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
239c0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
239d0 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
239e0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
239f0 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
23a00 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
23a10 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
23a20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
23a30 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
23a40 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
23a50 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23a60 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
23a70 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
23a80 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74  t nReg){.  sqlit
23a90 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
23aa0 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
23ab0 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
23ac0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
23ad0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
23ae0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
23af0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
23b00 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
23b10 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
23b20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
23b30 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
23b40 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
23b50 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
23b60 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
23b70 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
23b80 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23b90 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
23ba0 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
23bb0 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
23bc0 0a                                               .