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

Artifact 3fbe5a2a0be67b337b4947adde81694b4d48a84d:


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 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 20 20 20 2f 2a 20  *pCollName   /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 29 7b  g sequence */.){
09c0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65  .  if( pCollName
09d0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ->n>0 ){.    Exp
09e0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
09f0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
0a00: 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54  e->db, TK_COLLAT
0a10: 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31 29  E, pCollName, 1)
0a20: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
0a30: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c  {.      pNew->pL
0a40: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
0a50: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
0a60: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50 5f  = EP_Collate|EP_
0a70: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78 70  Skip;.      pExp
0a80: 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
0a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0aa0: 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c 69  pr;.}.Expr *sqli
0ab0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0ac0: 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a 70  eString(Parse *p
0ad0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0ae0: 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pr, const char *
0af0: 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b 0a  zC){.  Token s;.
0b00: 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30 20    assert( zC!=0 
0b10: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a 20  );.  s.z = zC;. 
0b20: 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   s.n = sqlite3St
0b30: 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20 72  rlen30(s.z);.  r
0b40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0b50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0b60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0b70: 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b  &s);.}../*.** Sk
0b80: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0b90: 4f 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53 20  OLLATE or TK_AS 
0ba0: 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61 6e  operators and an
0bb0: 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20  y unlikely().** 
0bc0: 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  or likelihood() 
0bd0: 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65 20  function at the 
0be0: 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72 65  root of an expre
0bf0: 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ssion..*/.Expr *
0c00: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
0c10: 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45 78  ollate(Expr *pEx
0c20: 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45  pr){.  while( pE
0c30: 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50 72  xpr && ExprHasPr
0c40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0c50: 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69 66  _Skip) ){.    if
0c60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
0c70: 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69  y(pExpr, EP_Unli
0c80: 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 61  kely) ){.      a
0c90: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
0ca0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0cb0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
0cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0cd0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
0ce0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  xpr>0 );.      a
0cf0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0d00: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
0d10: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d20: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
0d30: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [0].pExpr;.    }
0d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45 78  K_COLLATE || pEx
0d70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 3b  pr->op==TK_AS );
0d80: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d90: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0da0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0db0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0dc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0dd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0de0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0df0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e10: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e20: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e30: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e50: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e60: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e70: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0e80: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0e90: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ea0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0eb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ec0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ed0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0ee0: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0ef0: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f00: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f10: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f20: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f30: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f40: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f50: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0f80: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0f90: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fa0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fc0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0fd0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
0fe0: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
0ff0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1000: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1010: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1020: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1030: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1040: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1050: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1060: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1070: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1080: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1090: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10b0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10c0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10e0: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
10f0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1100: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1110: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1120: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1130: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1140: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1150: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1160: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1170: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
1180: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
1190: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11a0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11b0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11c0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11d0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
11e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
11f0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1200: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1210: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1220: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1230: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1240: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1260: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1270: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12b0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12c0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
12d0: 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e  ->pLeft) && (p->
12e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
12f0: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
1300: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  .        p = p->
1310: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLeft;.      }el
1320: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
1330: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1340: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1360: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1370: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
1380: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
1390: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
13a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
13b0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
13c0: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
13d0: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
13e0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
13f0: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
1400: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
1410: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
1420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1430: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1440: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1450: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1460: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
1470: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
1480: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
1490: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
14a0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
14b0: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
14c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14d0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
14e0: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
14f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
1500: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
1510: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
1520: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1530: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1540: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1550: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1560: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
1570: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1580: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1590: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
15a0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
15b0: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
15c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
15e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1600: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
1610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1620: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1630: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1640: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1650: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1660: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
1670: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
1680: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
1690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
16b0: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
16c0: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
16d0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
16e0: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
16f0: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
1700: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
1710: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
1720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1730: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1750: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1760: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
1770: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
1780: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
1790: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
17a0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
17b0: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
17c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
17d0: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
17e0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
17f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
1800: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
1810: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1820: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1830: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1840: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1850: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1860: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
1870: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
1880: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1890: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
18a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
18b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18c0: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
18d0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
18e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
18f0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
1900: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1910: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
1920: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
1930: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
1940: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1950: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1960: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1970: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
1980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1990: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
19a0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
19b0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
19c0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
19d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
19e0: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
19f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1a00: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
1a10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1a40: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1a50: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1a60: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1a70: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1a80: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1a90: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1aa0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1ab0: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
1ac0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
1ad0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
1ae0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
1af0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
1b00: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1b10: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
1b20: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1b30: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1b40: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1b50: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1b60: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1b70: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1b80: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1b90: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1ba0: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1bb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1bd0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
1be0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
1bf0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
1c00: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1c20: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1c30: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1c40: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1c50: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
1c60: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1c70: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1c80: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1c90: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1ca0: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1cb0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
1cc0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
1cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
1ce0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
1cf0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1d00: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1d10: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
1d20: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
1d30: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1d40: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
1d50: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
1d60: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1d70: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
1d80: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
1d90: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1da0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1db0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1dc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1dd0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1de0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1e00: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
1e10: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
1e30: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1e40: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1e50: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1e60: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1e70: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1e80: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e90: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1ea0: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1eb0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1ec0: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1ed0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
1ee0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
1ef0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
1f00: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
1f10: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
1f20: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
1f30: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
1f40: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
1f50: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
1f60: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
1f70: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
1f80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1f90: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
1fa0: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
1fb0: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
1fc0: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
1fd0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
1fe0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1ff0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2000: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2010: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2020: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2030: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
2050: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
2060: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2070: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
2080: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2090: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
20a0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
20b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
20c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20d0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
20e0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
20f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2100: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2120: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2130: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2150: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
2160: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2180: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
2190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21a0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
21b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
21c0: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
21d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
21e0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2200: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2210: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2220: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2230: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2240: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2250: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2260: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2270: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2280: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2290: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
22a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
22b0: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
22c0: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
22d0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
22e0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
22f0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2300: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2310: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2320: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2330: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2340: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2350: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2360: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2370: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2380: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2390: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
23a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
23b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
23c0: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
23d0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23f0: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2400: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2410: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2420: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2430: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2440: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
2450: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2460: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
2470: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
2480: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
2490: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
24a0: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
24b0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
24c0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
24d0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
24f0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
2500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
2510: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
2520: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2530: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2550: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2560: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2570: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2580: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2590: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
25a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
25c0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
25d0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
25e0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
25f0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
2600: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
2610: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2630: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2640: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2650: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2660: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2670: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2680: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2690: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
26a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
26b0: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
26c0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
26d0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
26e0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
26f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
2700: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
2710: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
2720: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2740: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2750: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2760: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2770: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2780: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2790: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
27a0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
27b0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
27c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
27d0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
27e0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
27f0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
2800: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
2810: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
2820: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2830: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2840: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2850: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2860: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2870: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2880: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2890: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
28a0: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
28b0: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
28c0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
28d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
28e0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
28f0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
2900: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
2910: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2930: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2940: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2950: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2960: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2970: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2980: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2990: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
29a0: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
29b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
29c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
29d0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
29e0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
29f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
2a00: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
2a10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2a20: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2a30: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2a40: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2a50: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2a60: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2a70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2a80: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2a90: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2aa0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2ab0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
2ac0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2ad0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
2ae0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
2af0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
2b00: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
2b10: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
2b20: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2b30: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2b40: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2b50: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2b60: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2b70: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2b80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2b90: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2bb0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2bc0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2bd0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
2be0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2bf0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
2c00: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
2c10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
2c20: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2c30: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
2c40: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
2c50: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
2c60: 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  lse{.    heightO
2c70: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
2c80: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
2c90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
2ca0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
2cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2cc0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2cd0: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
2ce0: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
2cf0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
2d00: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
2d10: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
2d20: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
2d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2d40: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
2d50: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
2d60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2d70: 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72  xprSetHeight(Par
2d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2d90: 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48   *p){.  exprSetH
2da0: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
2db0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2dc0: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
2dd0: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
2de0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
2df0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2e00: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
2e10: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
2e20: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
2e30: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
2e40: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
2e50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2e60: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
2e70: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2e80: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2e90: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
2ea0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
2eb0: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
2ec0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2ed0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
2ee0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ef0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2f00: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
2f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2f20: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
2f30: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
2f40: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
2f50: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2f60: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
2f70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2f80: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2f90: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
2fa0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
2fb0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
2fc0: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
2fd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2fe0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
2ff0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
3000: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
3010: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
3020: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
3030: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
3040: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3050: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
3060: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
3070: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
3080: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
3090: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
30a0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
30b0: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e  ing is performan
30c0: 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65  ce.  The deQuote
30d0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
30e0: 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b   ignored if pTok
30f0: 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  en is NULL or if
3100: 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20   the token does 
3110: 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f  not.** appear to
3120: 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20   be quoted.  If 
3130: 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20  the quotes were 
3140: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e  of the form "...
3150: 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  " (double-quotes
3160: 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50  ).** then the EP
3170: 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20  _DblQuoted flag 
3180: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78  is set on the ex
3190: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a  pression node..*
31a0: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73  *.** Special cas
31b0: 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e  e:  If op==TK_IN
31c0: 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e  TEGER and pToken
31d0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
31e0: 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  ing that.** can 
31f0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  be translated in
3200: 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  to a 32-bit inte
3210: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  ger, then the to
3220: 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74  ken is not.** st
3230: 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e  ored in u.zToken
3240: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
3250: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69  integer values i
3260: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
3270: 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74  o u.iValue and t
3280: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
3290: 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20  lag is set.  No 
32a0: 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a  extra storage.**
32b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f   is allocated to
32c0: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
32d0: 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64  r text and the d
32e0: 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69  equote flag is i
32f0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  gnored..*/.Expr 
3300: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f  *sqlite3ExprAllo
3310: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
3320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3330: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3340: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3350: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3360: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3380: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3390: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
33a0: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a  n *pToken,    /*
33b0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
33c0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
33d0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
3400: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
3410: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ew;.  int nExtra
3420: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c   = 0;.  int iVal
3430: 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ue = 0;..  if( p
3440: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
3450: 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op!=TK_INTEGER 
3460: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a  || pToken->z==0.
3470: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3480: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f  ite3GetInt32(pTo
3490: 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29  ken->z, &iValue)
34a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ==0 ){.      nEx
34b0: 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b  tra = pToken->n+
34c0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
34d0: 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20   iValue>=0 );.  
34e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
34f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3500: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3510: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
3520: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3530: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3540: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3550: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3560: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3570: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3580: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3590: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
35a0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
35b0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
35c0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
35d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
35e0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
35f0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
3600: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
3610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
3620: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
3630: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
3640: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
3650: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
3660: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3670: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3680: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3690: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
36a0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
36b0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
36c0: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
36d0: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
36e0: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
36f0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
3700: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
3710: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
3720: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3730: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
3740: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3750: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3760: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3770: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3790: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
37a0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
37b0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
37c0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
37d0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
37e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
37f0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3800: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
3810: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
3820: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
3830: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
3840: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3850: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3860: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3870: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3880: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3890: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
38a0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
38b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
38c0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
38d0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
38e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
38f0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
3900: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
3910: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3920: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
3930: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
3940: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3950: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3960: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3970: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3980: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
39a0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
39b0: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
39c0: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
39d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
39e0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
39f0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
3a00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3a10: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
3a20: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3a30: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
3a40: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3a50: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3a60: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3a70: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3a80: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3a90: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3aa0: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3ab0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3ac0: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
3ad0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
3ae0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
3af0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b00: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
3b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b20: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3b40: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3b50: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3b60: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
3b70: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
3b80: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
3b90: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
3ba0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
3bb0: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
3bc0: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
3bd0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
3be0: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3bf0: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
3c00: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
3c10: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
3c20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3c30: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
3c40: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
3c50: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
3c60: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
3c70: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
3c80: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
3c90: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
3ca0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3cb0: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
3cc0: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
3cd0: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
3ce0: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
3cf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
3d00: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
3d10: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
3d20: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
3d30: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
3d40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3d50: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
3d60: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
3d70: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
3d80: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3d90: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
3da0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
3dc0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
3dd0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
3de0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
3df0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
3e00: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  t Token *pToken 
3e10: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
3e20: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  token */.){.  Ex
3e30: 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d  pr *p;.  if( op=
3e40: 3d 54 4b 5f 41 4e 44 20 26 26 20 70 4c 65 66 74  =TK_AND && pLeft
3e50: 20 26 26 20 70 52 69 67 68 74 20 26 26 20 70 50   && pRight && pP
3e60: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
3e70: 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76  .    /* Take adv
3e80: 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d  antage of short-
3e90: 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70  circuit false op
3ea0: 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41  timization for A
3eb0: 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71  ND */.    p = sq
3ec0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
3ed0: 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20  rse->db, pLeft, 
3ee0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
3ef0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
3f00: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
3f10: 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f 6b 65  e->db, op, pToke
3f20: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
3f30: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3f40: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3f50: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3f60: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
3f70: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
3f80: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
3f90: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
3fa0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
3fb0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   p;.}../*.** If 
3fc0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3fd0: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
3fe0: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
3ff0: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
4000: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
4010: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
4020: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
4030: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
4040: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
4050: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
4060: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
4070: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
4080: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
4090: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
40a0: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
40b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
40c0: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
40d0: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
40e0: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
40f0: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
4100: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
4110: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4120: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
4130: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
4140: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
4150: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
4160: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
4170: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
4180: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
4190: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
41a0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
41b0: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
41c0: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
41d0: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
41e0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
41f0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
4200: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
4210: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
4220: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
4230: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
4240: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
4250: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
4260: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4270: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
4280: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
4290: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
42a0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
42b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
42c0: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
42d0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
42e0: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
42f0: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
4300: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4310: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
4320: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
4330: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
4340: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
4350: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
4360: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
4370: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
4380: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
4390: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
43a0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
43b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
43c0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
43d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
43e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
43f0: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
4400: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4410: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
4420: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
4430: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
4440: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
4450: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
4460: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
4470: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
4480: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
4490: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
44a0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
44b0: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
44c0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
44d0: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
44e0: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
44f0: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
4500: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
4510: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
4520: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
4530: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
4540: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
4550: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
4560: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
4570: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4580: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
4590: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
45a0: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
45b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
45c0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
45d0: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
45e0: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
45f0: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
4600: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
4610: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4620: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
4630: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4640: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
4650: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
4660: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
4670: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
4680: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
4690: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
46a0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
46b0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
46c0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
46d0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
46e0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
46f0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
4700: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4710: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
4720: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
4730: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4740: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4750: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4760: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4770: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4780: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4790: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
47a0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
47b0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
47c0: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
47d0: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
47e0: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
47f0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
4800: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
4810: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
4820: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
4830: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4840: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4850: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4860: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
4870: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4880: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4890: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
48a0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
48b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
48c0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
48d0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
48e0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
48f0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
4900: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
4910: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
4920: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
4930: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
4940: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
4950: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
4960: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
4970: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4980: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4990: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
49a0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
49b0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
49c0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
49d0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
49e0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
49f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
4a00: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
4a10: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
4a20: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
4a30: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4a40: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4a50: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4a60: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4a70: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4a80: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4a90: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
4aa0: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
4ab0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
4ac0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
4ad0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
4ae0: 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72  t sequential var
4af0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
4b00: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
4b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
4b20: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
4b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
4b40: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
4b50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4b60: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
4b70: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
4b80: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
4b90: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
4ba0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4bb0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
4bc0: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
4bd0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
4be0: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
4bf0: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
4c00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
4c10: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66   z[0]!=0 );.  if
4c20: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
4c30: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
4c40: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
4c50: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
4c60: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4c70: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
4c80: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70  0]=='?' );.    p
4c90: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4ca0: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
4cb0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65  ->nVar);.  }else
4cc0: 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20  {.    ynVar x = 
4cd0: 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73  0;.    u32 n = s
4ce0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4cf0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  );.    if( z[0]=
4d00: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
4d10: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
4d20: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
4d30: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
4d40: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
4d50: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
4d60: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
4d70: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
4d80: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
4d90: 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33  bOk = 0==sqlite3
4da0: 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69  Atoi64(&z[1], &i
4db0: 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  , n-1, SQLITE_UT
4dc0: 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  F8);.      pExpr
4dd0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
4de0: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
4df0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29  testcase( i==0 )
4e00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4e10: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i==1 );.      
4e20: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
4e30: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4e40: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4e50: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20  MBER]-1 );.     
4e60: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
4e70: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4e80: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4e90: 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20  UMBER] );.      
4ea0: 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c  if( bOk==0 || i<
4eb0: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
4ec0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4ed0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4ee0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4ef0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4f00: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
4f10: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
4f20: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
4f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
4f40: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4f50: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4f60: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20  MBER]);.        
4f70: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  x = 0;.      }. 
4f80: 20 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73       if( i>pPars
4f90: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4fa0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
4fb0: 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20  = (int)i;.      
4fc0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4fd0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
4fe0: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
4ff0: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
5000: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
5010: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
5020: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
5030: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
5040: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
5050: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
5060: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
5070: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
5080: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
5090: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
50a0: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
50b0: 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20     ynVar i;.    
50c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
50d0: 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29  rse->nzVar; i++)
50e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
50f0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26  arse->azVar[i] &
5100: 26 20 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d  & strcmp(pParse-
5110: 3e 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20  >azVar[i],z)==0 
5120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
5130: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
5140: 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20  = (ynVar)i+1;.  
5150: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5170: 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20  .      if( x==0 
5180: 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  ) x = pExpr->iCo
5190: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
51a0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
51b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e      }.    if( x>
51c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78  0 ){.      if( x
51d0: 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29  >pParse->nzVar )
51e0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
51f0: 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20  *a;.        a = 
5200: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
5210: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
5220: 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30  ar, x*sizeof(a[0
5230: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ]));.        if(
5240: 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   a==0 ) return; 
5250: 20 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74   /* Error report
5260: 65 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d  ed through db->m
5270: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20  allocFailed */. 
5280: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
5290: 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20  zVar = a;.      
52a0: 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72    memset(&a[pPar
52b0: 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28  se->nzVar], 0, (
52c0: 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29  x-pParse->nzVar)
52d0: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
52e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
52f0: 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20  nzVar = x;.     
5300: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30   }.      if( z[0
5310: 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65  ]!='?' || pParse
5320: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20  ->azVar[x-1]==0 
5330: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5340: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61  e3DbFree(db, pPa
5350: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29  rse->azVar[x-1])
5360: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
5370: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73  ->azVar[x-1] = s
5380: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
5390: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  db, z, n);.     
53a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
53b0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
53c0: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
53d0: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
53e0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
53f0: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
5400: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5410: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
5420: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
5430: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
5440: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
5450: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
5460: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
5470: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
5480: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
5490: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
54a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
54b0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
54c0: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
54d0: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
54e0: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
54f0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
5500: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5510: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
5520: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
5530: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  alue>=0 );.  if(
5540: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5550: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
5560: 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  y) ){.    /* The
5570: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
5580: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
5590: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
55a0: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
55b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
55c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
55d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
55e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
55f0: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5610: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52  Delete(db, p->pR
5620: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
5630: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5640: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
5650: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5660: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
5670: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
5680: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5690: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
56a0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
56b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
56c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
56d0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
56e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
56f0: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
5700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5710: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5720: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
5730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5740: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
5750: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
5760: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5770: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5780: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
5790: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
57a0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
57b0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
57c0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
57d0: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
57e0: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
57f0: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
5800: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
5810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
5820: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
5830: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
5840: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5850: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
5860: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
5870: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
5880: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5890: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
58a0: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
58b0: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
58c0: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
58d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
58e0: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
58f0: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
5900: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5910: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
5920: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
5930: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
5940: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
5950: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
5960: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
5970: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
5980: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
5990: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
59a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
59b0: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
59c0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
59d0: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
59e0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
59f0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
5a00: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
5a10: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
5a20: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
5a30: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
5a40: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
5a50: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
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 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
5ab0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
5ac0: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
5ad0: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
5ae0: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
5af0: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
5b00: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
5b10: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
5b20: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
5b30: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
5b40: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
5b50: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
5b60: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
5b70: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
5b80: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
5b90: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
5ba0: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
5bb0: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
5bc0: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
5bd0: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
5be0: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
5bf0: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
5c00: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
5c10: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
5c20: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
5c30: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
5c40: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
5c50: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
5c60: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
5c70: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
5c80: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
5c90: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
5ca0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
5cb0: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
5cc0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
5cd0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
5ce0: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
5cf0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
5d00: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
5d10: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
5d20: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
5d30: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
5d40: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
5d50: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
5d60: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
5d70: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
5d80: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
5d90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
5da0: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
5db0: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
5dc0: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
5dd0: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
5de0: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
5df0: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
5e00: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
5e10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
5e20: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
5e30: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
5e40: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
5e50: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
5e60: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
5e70: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
5e80: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
5e90: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
5ea0: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
5eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5ec0: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
5ed0: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
5ee0: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
5ef0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
5f00: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
5f10: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
5f20: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
5f30: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
5f40: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
5f50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5f60: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5f70: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
5f80: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
5f90: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
5fa0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
5fb0: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
5fc0: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
5fd0: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
5fe0: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
5ff0: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
6000: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
6010: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
6020: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6030: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
6040: 69 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58  if( 0==(flags&EX
6050: 50 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b  PRDUP_REDUCE) ){
6060: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
6070: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
6080: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6090: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
60a0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
60b0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
60c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
60d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
60e0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
60f0: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
6100: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6110: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
6120: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
6130: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6140: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
6150: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
6160: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
6170: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
6180: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
6190: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
61a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
61b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
61c0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
61d0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
61e0: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
61f0: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
6200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
6210: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
6220: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
6230: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
6240: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
6250: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
6260: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
6270: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
6280: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
6290: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
62a0: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
62b0: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
62c0: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
62d0: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
62e0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
62f0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6300: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
6310: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
6320: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
6330: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
6340: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
6350: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
6360: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
6370: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
6380: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b  30(p->u.zToken)+
6390: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
63a0: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d  ROUND8(nByte);.}
63b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
63c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
63d0: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  es required to c
63e0: 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74  reate a duplicat
63f0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  e of the .** exp
6400: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
6410: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
6420: 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64  ment. The second
6430: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
6440: 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e  * mask containin
6450: 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  g EXPRDUP_XXX fl
6460: 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
6470: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
6480: 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20  cludes space to 
6490: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
64a0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
64b0: 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74  .** itself and t
64c0: 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72  he buffer referr
64d0: 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e  ed to by Expr.u.
64e0: 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a  zToken, if any..
64f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  **.** If the EXP
6500: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
6510: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
6520: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
6530: 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63  ncludes .** spac
6540: 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61  e to duplicate a
6550: 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e  ll Expr nodes in
6560: 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64   the tree formed
6570: 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a   by Expr.pLeft .
6580: 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67  ** and Expr.pRig
6590: 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75  ht variables (bu
65a0: 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74  t not for any st
65b0: 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64  ructures pointed
65c0: 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65   to or .** desce
65d0: 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78  nded from the Ex
65e0: 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78  pr.x.pList or Ex
65f0: 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72  pr.x.pSelect var
6600: 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74  iables)..*/.stat
6610: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
6620: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
6630: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
6640: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28  nByte = 0;.  if(
6650: 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20   p ){.    nByte 
6660: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
6670: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
6680: 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50     if( flags&EXP
6690: 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20  RDUP_REDUCE ){. 
66a0: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75       nByte += du
66b0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
66c0: 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64  Left, flags) + d
66d0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
66e0: 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a  pRight, flags);.
66f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6700: 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nByte;.}../*.
6710: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6720: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
6730: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c  qlite3ExprDup(),
6740: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20   except that if 
6750: 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20  pzBuffer .** is 
6760: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70  not NULL then *p
6770: 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d  zBuffer is assum
6780: 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ed to point to a
6790: 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e   buffer large en
67a0: 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72  ough .** to stor
67b0: 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78  e the copy of ex
67c0: 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20  pression p, the 
67d0: 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a  copies of p->u.z
67e0: 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70  Token.** (if app
67f0: 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68  licable), and th
6800: 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
6810: 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e  p->pLeft and p->
6820: 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f  pRight expressio
6830: 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42  ns,.** if any. B
6840: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
6850: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65   *pzBuffer is se
6860: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  t to the first b
6870: 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20  yte past the.** 
6880: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
6890: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
68a0: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
68b0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
68c0: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
68d0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
68e0: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20  , int flags, u8 
68f0: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
6900: 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  xpr *pNew = 0;  
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
6930: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20  return */.  if( 
6940: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6950: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6960: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6970: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6980: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6990: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
69a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
69b0: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
69c0: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
69d0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
69e0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
69f0: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
6a00: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
6a10: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
6a20: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
6a30: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
6a40: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
6a50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6a60: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
6a70: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6a80: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
6a90: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
6aa0: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
6ab0: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
6ac0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
6ad0: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
6ae0: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
6af0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
6b00: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
6b10: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
6b20: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
6b30: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
6b40: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
6b50: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
6b60: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
6b70: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
6b80: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6b90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
6ba0: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
6bb0: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
6bc0: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
6bd0: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
6be0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
6bf0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
6c00: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
6c10: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
6c20: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
6c30: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
6c40: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
6c50: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20   & 0xfff;.      
6c60: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
6c70: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
6c80: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
6c90: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
6ca0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  Token ){.       
6cb0: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
6cc0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
6cd0: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
6ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6cf0: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
6d00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
6d10: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
6d20: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
6d30: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6d40: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
6d50: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
6d60: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
6d70: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
6d80: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
6d90: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
6da0: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
6db0: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6dc0: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
6dd0: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
6de0: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
6df0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
6e00: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
6e10: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
6e20: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
6e30: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
6e40: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
6e50: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
6e60: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6e70: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
6e80: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
6e90: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
6ea0: 65 6e 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  en);.      pNew-
6eb0: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
6ec0: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
6ed0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
6ee0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
6ef0: 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c  lags |= staticFl
6f00: 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  ag;..      /* Co
6f10: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
6f20: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
6f30: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
6f40: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
6f50: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d    char *zToken =
6f60: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
6f70: 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63  = (char*)&zAlloc
6f80: 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20  [nNewSize];.    
6f90: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
6fa0: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
6fb0: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  nToken);.      }
6fc0: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
6fd0: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
6fe0: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
6ff0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7000: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
7010: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
7020: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
7030: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
7040: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7050: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
7060: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
7070: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
7080: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7090: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
70a0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65  >x.pSelect, isRe
70b0: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
70c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
70d0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
70e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70f0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
7100: 73 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  st, isReduced);.
7110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7120: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  }..      /* Fill
7130: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
7140: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
7150: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
7160: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7170: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
7180: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7190: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
71a0: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
71b0: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
71c0: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
71d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
71e0: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
71f0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7200: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
7210: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
7220: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
7230: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
7240: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
7250: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
7260: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
7270: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
7280: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7290: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
72a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
72b0: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
72c0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
72d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
72e0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
72f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
7300: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
7310: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
7320: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7330: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
7340: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  0);.          pN
7350: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
7360: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7370: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
7380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7390: 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ..    }.  }.  re
73a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
73b0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
73c0: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
73d0: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
73e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
73f0: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
7400: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
7410: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
7420: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
7430: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
7440: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
7450: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
7460: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7470: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
7480: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
7490: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
74a0: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
74b0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
74c0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
74d0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
74e0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
74f0: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
7500: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
7510: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
7520: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
7530: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
7540: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
7550: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
7560: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7570: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
7580: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
7590: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
75a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
75b0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
75c0: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
75d0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
75e0: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
75f0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
7600: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
7610: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
7620: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
7630: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
7640: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
7650: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7660: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
7670: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
7680: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
7690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
76a0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
76b0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
76c0: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
76d0: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
76e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
76f0: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
7700: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
7710: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
7720: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
7730: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
7740: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
7750: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
7760: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
7770: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
7780: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
7790: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
77a0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
77b0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
77c0: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
77d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
77e0: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
77f0: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
7800: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
7810: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
7820: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
7830: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
7840: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
7850: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
7860: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
7870: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
7880: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
7890: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
78a0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
78b0: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
78c0: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
78d0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
78e0: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
78f0: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
7900: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
7910: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
7920: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
7930: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
7940: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
7950: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
7960: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7970: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
7980: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
7990: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
79a0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
79b0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
79c0: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
79d0: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
79e0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
79f0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
7a00: 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64 62  eturn exprDup(db
7a10: 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  , p, flags, 0);.
7a20: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
7a30: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
7a40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7a50: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7a60: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
7a70: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
7a80: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
7a90: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
7aa0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7ab0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
7ac0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
7ad0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7ae0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
7af0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7b00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
7b10: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20  ew->nExpr = i = 
7b20: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  p->nExpr;.  if( 
7b30: 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50  (flags & EXPRDUP
7b40: 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f  _REDUCE)==0 ) fo
7b50: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=1; i<p->nExp
7b60: 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65  r; i+=i){}.  pNe
7b70: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
7b80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7b90: 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28  w(db,  i*sizeof(
7ba0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
7bb0: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
7bc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7bd0: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
7be0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
7bf0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
7c00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7c10: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
7c20: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
7c30: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
7c40: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
7c50: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  ->pExpr;.    pIt
7c60: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
7c70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7c80: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
7c90: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
7ca0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7cb0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7cc0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
7cd0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
7ce0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7cf0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
7d00: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
7d10: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
7d20: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
7d30: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
7d40: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
7d50: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
7d60: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
7d70: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
7d80: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
7d90: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
7da0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
7db0: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
7dc0: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
7dd0: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
7de0: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
7df0: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
7e00: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7e10: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
7e20: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
7e30: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
7e40: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
7e50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7e60: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
7e70: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
7e80: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
7e90: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
7ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
7eb0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7ec0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
7ed0: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
7ee0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
7ef0: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
7f00: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
7f10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
7f20: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
7f30: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
7f40: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
7f50: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
7f60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
7f70: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
7f80: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
7f90: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
7fa0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
7fb0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
7fc0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
7fd0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
7fe0: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
7ff0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8000: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
8010: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
8020: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
8030: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
8040: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
8050: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
8060: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
8070: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
8080: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
8090: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
80a0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
80b0: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
80c0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
80d0: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
80e0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
80f0: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
8100: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8110: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
8120: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8130: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
8140: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8150: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8160: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
8170: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
8180: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8190: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
81a0: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
81b0: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
81c0: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
81d0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
81e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
81f0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
8200: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
8210: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
8220: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
8230: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
8240: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
8250: 74 75 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74  turn;.    pNewIt
8260: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
8270: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43   = pOldItem->isC
8280: 6f 72 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70  orrelated;.    p
8290: 4e 65 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  NewItem->viaCoro
82a0: 75 74 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d  utine = pOldItem
82b0: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a  ->viaCoroutine;.
82c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
82d0: 52 65 63 75 72 73 69 76 65 20 3d 20 70 4f 6c 64  Recursive = pOld
82e0: 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  Item->isRecursiv
82f0: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
8300: 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
8310: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8320: 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b  ldItem->zIndex);
8330: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e  .    pNewItem->n
8340: 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64  otIndexed = pOld
8350: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
8360: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8370: 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  pIndex = pOldIte
8380: 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  m->pIndex;.    p
8390: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
83a0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
83b0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
83c0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
83d0: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
83e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
83f0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
8400: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
8410: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
8420: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
8430: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
8440: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8450: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
8460: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
8470: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
8480: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
8490: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
84a0: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
84b0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
84c0: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
84d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
84e0: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
84f0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
8500: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
8510: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
8520: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
8530: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8540: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
8550: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8560: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
8570: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
8580: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8590: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
85a0: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
85b0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
85c0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e  llocRaw(db, p->n
85d0: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
85e0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
85f0: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
8600: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8610: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
8620: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
8630: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
8640: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
8650: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
8660: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
8670: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
8680: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
8690: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
86a0: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
86b0: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
86c0: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
86d0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
86e0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
86f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
8700: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
8710: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
8720: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
8730: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
8740: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
8750: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
8760: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
8770: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
8780: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8790: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
87a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
87b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
87c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
87d0: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
87e0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
87f0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
8800: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
8810: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
8820: 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  , *pPrior;.  if(
8830: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
8840: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
8850: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8860: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
8870: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
8880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8890: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
88a0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
88b0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
88c0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  gs);.  pNew->pSr
88d0: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
88e0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
88f0: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  c, flags);.  pNe
8900: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
8910: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8920: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
8930: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
8940: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
8950: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
8960: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
8970: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
8980: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8990: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
89a0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
89b0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
89c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
89d0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
89e0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
89f0: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
8a00: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
8a10: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
8a20: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
8a30: 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20  Prior, flags);. 
8a40: 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
8a50: 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
8a60: 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ew;.  pNew->pNex
8a70: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
8a80: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
8a90: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
8aa0: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
8ab0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
8ac0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8ad0: 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66  b, p->pOffset, f
8ae0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  lags);.  pNew->i
8af0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
8b00: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->iOffset = 0;.
8b10: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
8b20: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
8b30: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
8b40: 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  al;.  pNew->addr
8b50: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
8b60: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
8b70: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
8b80: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
8b90: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
8ba0: 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74  ow;.  pNew->pWit
8bb0: 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20  h = withDup(db, 
8bc0: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c  p->pWith);.  sql
8bd0: 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
8be0: 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e  e(pNew, p->zSelN
8bf0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
8c00: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
8c10: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
8c20: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
8c30: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
8c40: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
8c50: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
8c60: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
8c70: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
8c80: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
8c90: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
8ca0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
8cb0: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
8cc0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
8cd0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
8ce0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
8cf0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
8d00: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
8d10: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
8d20: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
8d30: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
8d40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
8d50: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
8d60: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
8d70: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
8d80: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
8d90: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
8da0: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
8db0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
8dc0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8dd0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8de0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
8df0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8e00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8e10: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
8e20: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
8e30: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
8e40: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
8e50: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
8e60: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8e70: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
8e80: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
8e90: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
8ea0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8eb0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8ec0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
8ed0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8ee0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
8ef0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
8f00: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8f10: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
8f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
8f30: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  t->a = sqlite3Db
8f40: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8f50: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
8f60: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
8f70: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
8f80: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
8f90: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
8fa0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
8fb0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
8fc0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8fd0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
8fe0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
8ff0: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
9000: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
9010: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
9020: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
9030: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
9040: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
9050: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
9060: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
9070: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
9080: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9090: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
90a0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
90b0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
90c0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
90d0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
90e0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
90f0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
9100: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
9110: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
9120: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9130: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
9140: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
9150: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
9160: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
9170: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
9180: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9190: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
91a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
91b0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
91c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
91d0: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
91e0: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
91f0: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
9200: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
9210: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
9220: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
9230: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
9240: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
9250: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
9260: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
9270: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
9280: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
9290: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
92a0: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
92b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
92c0: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
92d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
92e0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
92f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9310: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9320: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9330: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
9340: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
9350: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
9360: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
9370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9380: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
9390: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
93a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
93b0: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
93c0: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
93d0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
93e0: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
93f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9400: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
9410: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
9420: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9430: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9440: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9450: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
9460: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
9470: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
9480: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
9490: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
94a0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
94b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
94c0: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
94d0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
94e0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
94f0: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
9500: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
9510: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
9520: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
9530: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
9540: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
9550: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
9560: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9570: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
9580: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9590: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
95a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
95b0: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
95c0: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
95d0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
95e0: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
95f0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9600: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
9610: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9620: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
9630: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
9640: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
9650: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
9660: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
9670: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9680: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9690: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
96a0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
96b0: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
96c0: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
96d0: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
96e0: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
96f0: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
9700: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9710: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
9720: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
9730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
9740: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
9750: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9760: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9770: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
9780: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9790: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
97a0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
97b0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
97c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
97d0: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
97e0: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
97f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9800: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
9810: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
9820: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
9830: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
9840: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
9880: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
9890: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
98a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
98b0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
98c0: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
98d0: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
98e0: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
98f0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9900: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
9910: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9920: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
9930: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9940: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9950: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
9960: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
9970: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
9980: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
9990: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
99a0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
99b0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
99c0: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
99d0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
99e0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
99f0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
9a00: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
9a10: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
9a20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9a30: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
9a40: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
9a50: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
9a60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
9a70: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
9a80: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
9a90: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9aa0: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
9ab0: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
9ac0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
9ad0: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
9ae0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9af0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9b00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
9b10: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
9b20: 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
9b30: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  ==0 );.  for(pIt
9b40: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
9b50: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
9b60: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
9b80: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
9b90: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
9ba0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9bb0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
9bc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9bd0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
9be0: 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
9bf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
9c00: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
9c10: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
9c20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
9c30: 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79 20 65  rn TRUE if any e
9c40: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 45 78 70  xpression in Exp
9c50: 72 4c 69 73 74 20 68 61 73 20 61 6e 79 20 6f 66  rList has any of
9c60: 20 74 68 65 20 45 50 5f 2a 0a 2a 2a 20 70 72 6f   the EP_*.** pro
9c70: 70 65 72 74 69 65 73 20 67 69 76 65 6e 20 62 79  perties given by
9c80: 20 22 6d 22 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   "m".*/.int sqli
9c90: 74 65 33 41 6e 79 45 78 70 72 4c 69 73 74 48 61  te3AnyExprListHa
9ca0: 73 50 72 6f 70 65 72 74 79 28 63 6f 6e 73 74 20  sProperty(const 
9cb0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9cc0: 20 75 33 32 20 6d 29 7b 0a 20 20 69 6e 74 20 69   u32 m){.  int i
9cd0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9ce0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
9cf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9d00: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9d10: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9d20: 70 65 72 74 79 28 70 4c 69 73 74 2d 3e 61 5b 69  perty(pList->a[i
9d30: 5d 2e 70 45 78 70 72 2c 20 6d 29 20 29 20 72 65  ].pExpr, m) ) re
9d40: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
9d50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9d60: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
9d70: 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  are Walker callb
9d80: 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65  acks used to che
9d90: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ck expressions t
9da0: 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79  o.** see if they
9db0: 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20   are "constant" 
9dc0: 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74  for some definit
9dd0: 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e  ion of constant.
9de0: 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e    The.** Walker.
9df0: 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65  eCode value dete
9e00: 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70 65 20  rmines the type 
9e10: 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65  of "constant" we
9e20: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20   are looking.** 
9e30: 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  for..**.** These
9e40: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
9e50: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69  es are used to i
9e60: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c  mplement the fol
9e70: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
9e80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
9e90: 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20  onstant()       
9ea0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
9eb0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20  er->eCode==1.** 
9ec0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9ed0: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
9ee0: 28 29 20 20 20 20 20 20 20 20 20 20 20 70 57 61  ()           pWa
9ef0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a  lker->eCode==2.*
9f00: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9f10: 72 52 65 66 4f 6e 65 54 61 62 6c 65 4f 6e 6c 79  rRefOneTableOnly
9f20: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ()             p
9f30: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33  Walker->eCode==3
9f40: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
9f50: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
9f60: 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20  unction()       
9f70: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
9f80: 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e  =4 or 5.**.** In
9f90: 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20   all cases, the 
9fa0: 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61  callbacks set Wa
9fb0: 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64  lker.eCode=0 and
9fc0: 20 61 62 6f 72 74 20 69 66 20 74 68 65 20 65 78   abort if the ex
9fd0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66  pression.** is f
9fe0: 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61  ound to not be a
9ff0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a   constant..**.**
a000: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
a010: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
a020: 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66  tion() is used f
a030: 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78  or evaluating ex
a040: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20  pressions.** in 
a050: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a060: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57  tatement.  The W
a070: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
a080: 65 20 69 73 20 35 20 77 68 65 6e 20 70 61 72 73  e is 5 when pars
a090: 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69  ing.** an existi
a0a0: 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20  ng schema and 4 
a0b0: 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
a0c0: 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e  a new statement.
a0d0: 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72    A bound.** par
a0e0: 61 6d 65 74 65 72 20 72 61 69 73 65 73 20 61 6e  ameter raises an
a0f0: 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73   error for new s
a100: 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69  tatements, but i
a110: 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65  s silently conve
a120: 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20  rted.** to NULL 
a130: 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73 63 68  for existing sch
a140: 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f  emas.  This allo
a150: 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ws sqlite_master
a160: 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a   tables that .**
a170: 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64   contain a bound
a180: 20 70 61 72 61 6d 65 74 65 72 20 62 65 63 61 75   parameter becau
a190: 73 65 20 74 68 65 79 20 77 65 72 65 20 67 65 6e  se they were gen
a1a0: 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20  erated by older 
a1b0: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
a1c0: 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61 72 73  QLite to be pars
a1d0: 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
a1e0: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77  ions of SQLite w
a1f0: 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61  ithout raising a
a200: 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63  .** malformed sc
a210: 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  hema error..*/.s
a220: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
a230: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
a240: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
a250: 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f  pr *pExpr){..  /
a260: 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43  * If pWalker->eC
a270: 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e  ode is 2 then an
a280: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
a290: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
a2a0: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
a2b0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
a2c0: 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20  auses of a left 
a2d0: 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65  join disqualifie
a2e0: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
a2f0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67  .  ** from being
a300: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73   considered cons
a310: 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tant. */.  if( p
a320: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
a330: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
a340: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
a350: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70  omJoin) ){.    p
a360: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
a370: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
a380: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
a390: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
a3a0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
a3b0: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
a3c0: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
a3d0: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
a3e0: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
a3f0: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74  t.    ** and eit
a400: 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  her pWalker->eCo
a410: 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68  de==4 or 5 or th
a420: 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  e function has t
a430: 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  he.    ** SQLITE
a440: 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67  _FUNC_CONST flag
a450: 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  . */.    case TK
a460: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
a470: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
a480: 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61  ode>=4 || ExprHa
a490: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
a4a0: 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b  EP_ConstFunc) ){
a4b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a4c0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
a4d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a4e0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a4f0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
a500: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
a510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
a520: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
a530: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
a540: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
a550: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
a560: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
a570: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a580: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
a590: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a5a0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
a5b0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
a5c0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
a5d0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
a5e0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
a5f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
a600: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
a610: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  N );.      if( p
a620: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33  Walker->eCode==3
a630: 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
a640: 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43  e==pWalker->u.iC
a650: 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ur ){.        re
a660: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
a670: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
a680: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a690: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
a6a0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
a6b0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
a6c0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
a6d0: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  LE:.      if( pW
a6e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20  alker->eCode==5 
a6f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ){.        /* Si
a700: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62  lently convert b
a710: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20  ound parameters 
a720: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 73 69  that appear insi
a730: 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20  de of CREATE.   
a740: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
a750: 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77  ts into a NULL w
a760: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
a770: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
a780: 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20   text out.      
a790: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69    ** of the sqli
a7a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
a7b0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
a7c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
a7d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a7e0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
a7f0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
a800: 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  A bound paramete
a810: 72 20 69 6e 20 61 20 43 52 45 41 54 45 20 73 74  r in a CREATE st
a820: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69  atement that ori
a830: 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20  ginates from.   
a840: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
a850: 70 72 65 70 61 72 65 28 29 20 63 61 75 73 65 73  prepare() causes
a860: 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
a870: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
a880: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
a890: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
a8a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a8b0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
a8c0: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
a8d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a8e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
a8f0: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
a900: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
a910: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
a920: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
a930: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a940: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
a950: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a960: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
a970: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a980: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
a990: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
a9a0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
a9b0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
a9c0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
a9d0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
a9e0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
a9f0: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
aa00: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
aa10: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
aa20: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
aa30: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
aa40: 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e  int initFlag, in
aa50: 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65  t iCur){.  Walke
aa60: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
aa70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
aa80: 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69  .  w.eCode = ini
aa90: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
aaa0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
aab0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
aac0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
aad0: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
aae0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75  sConstant;.  w.u
aaf0: 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20  .iCur = iCur;.  
ab00: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
ab10: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
ab20: 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   w.eCode;.}../*.
ab30: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
ab40: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ab50: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
ab60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ab70: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
ab80: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
ab90: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
aba0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
abb0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
abc0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
abd0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
abe0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
abf0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
ac00: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
ac10: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
ac20: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
ac30: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
ac40: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
ac50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ac60: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
ac70: 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  pr *p){.  return
ac80: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
ac90: 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1, 0);.}../*.** 
aca0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
acb0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
acc0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
ace0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20  onstant.** that 
acf0: 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74  does no originat
ad00: 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72  e from the ON or
ad10: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
ad20: 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74  f a join..** Ret
ad30: 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f  urn 0 if it invo
ad40: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
ad50: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
ad60: 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a   or terms from.*
ad70: 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47  * an ON or USING
ad80: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
ad90: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ada0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70  stantNotJoin(Exp
adb0: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
adc0: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
add0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 0);.}../*.** W
ade0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
adf0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
ae00: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
ae10: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 74  expression const
ae20: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
ae30: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
ae40: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
ae50: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
ae60: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
ae70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
ae80: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
ae90: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
aea0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
aeb0: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
aec0: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
aed0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
aee0: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
aef0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
af00: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
af10: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
af20: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
af30: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
af40: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
af50: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
af60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
af70: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
af80: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
af90: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
afa0: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
afb0: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
afc0: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
afd0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
afe0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
aff0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
b000: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
b010: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
b020: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b030: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
b040: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
b050: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
b060: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
b070: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
b080: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
b090: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
b0a0: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
b0c0: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
b0d0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
b0e0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
b0f0: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  sInit, 0);.}../*
b100: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
b110: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
b120: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
b130: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
b140: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
b150: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
b160: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
b170: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
b180: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
b190: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
b1a0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b1b0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
b1c0: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
b1d0: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
b1e0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
b1f0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
b200: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
b210: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
b220: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b230: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
b240: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
b250: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
b260: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   0;..  /* If an 
b270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
b280: 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
b290: 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
b2a0: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
b2b0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
b2c0: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
b2d0: 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
b2e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
b2f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b300: 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
b310: 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
b320: 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
b330: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
b340: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
b350: 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
b360: 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
b370: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
b380: 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
b390: 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
b3a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b3b0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
b3c0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
b3d0: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
b3e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
b3f0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
b400: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
b410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b420: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
b430: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
b440: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
b450: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
b460: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
b470: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b480: 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
b490: 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
b4a0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
b4b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
b4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b4d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b4e0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
b4f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b500: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b510: 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
b520: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
b530: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b540: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
b550: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
b560: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
b570: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
b580: 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
b590: 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
b5a0: 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
b5b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b5c0: 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
b5d0: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
b5e0: 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
b5f0: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
b600: 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
b610: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
b620: 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
b630: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
b640: 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
b650: 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
b660: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
b670: 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
b680: 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
b690: 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
b6a0: 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
b6b0: 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
b6c0: 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
b6d0: 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
b6e0: 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
b6f0: 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
b700: 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
b710: 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
b720: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
b730: 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
b740: 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
b750: 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
b760: 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
b770: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
b780: 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
b790: 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
b7a0: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
b7b0: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
b7c0: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
b7d0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
b7e0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
b7f0: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
b800: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
b810: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
b820: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
b830: 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
b840: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
b850: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
b860: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
b870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
b880: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b890: 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  MN:.      assert
b8a0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  ( p->pTab!=0 );.
b8b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70        return Exp
b8c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
b8d0: 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c  EP_CanBeNull) ||
b8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
b8f0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
b900: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  p->pTab->aCol[p-
b910: 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
b920: 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
b930: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
b940: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
b950: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
b960: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
b970: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
b980: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
b990: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
b9a0: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
b9b0: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
b9c0: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
b9d0: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
b9e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b9f0: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
ba00: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ba10: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
ba20: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
ba30: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
ba40: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
ba50: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
ba60: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
ba70: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
ba80: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
ba90: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
baa0: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
bab0: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
bac0: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
bad0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
bae0: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
baf0: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
bb00: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
bb10: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72  ITE_AFF_NONE ) r
bb20: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
bb30: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
bb40: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
bb50: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
bb60: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
bb70: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
bb80: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
bb90: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
bba0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
bbb0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
bbc0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
bbd0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
bbe0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
bbf0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
bc00: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
bc10: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
bc20: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
bc30: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
bc40: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
bc50: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
bc60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
bc70: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
bc80: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
bc90: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
bca0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
bcb0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
bcc0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
bcd0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
bce0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
bcf0: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
bd00: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
bd10: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
bd20: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
bd30: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
bd40: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
bd50: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
bd60: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
bd70: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
bd80: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
bd90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
bda0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
bdb0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
bdc0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
bdd0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
bde0: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
bdf0: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
be00: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
be10: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
be20: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
be30: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
be40: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
be50: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
be60: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
be70: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
be80: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
be90: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
bea0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
beb0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
bec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
bed0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  ue if we are abl
bee0: 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72  e to the IN oper
bef0: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
bf00: 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20  n on a.** query 
bf10: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
bf20: 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  *       x IN (SE
bf30: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
bf40: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
bf50: 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73  ... clause is as
bf60: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
bf70: 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  e parameter to t
bf80: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  his.** routine..
bf90: 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74  **.** The Select
bfa0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   object passed i
bfb0: 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
bfc0: 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  en preprocessed 
bfd0: 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73  and no.** errors
bfe0: 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
bff0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
c000: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c010: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
c020: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
c030: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
c040: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
c050: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c060: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
c070: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
c080: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
c090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
c0a0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
c0b0: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
c0c0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
c0d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
c0f0: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
c100: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
c110: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
c120: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
c130: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
c140: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
c150: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
c160: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
c170: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
c180: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
c190: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
c1a0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
c1b0: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
c1c0: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
c1d0: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
c1e0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
c1f0: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
c200: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
c210: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
c220: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
c230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
c240: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
c250: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
c260: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
c270: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c280: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
c290: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
c2a0: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
c2b0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c2c0: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
c2d0: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
c2e0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
c2f0: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
c300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
c310: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
c320: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
c330: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
c340: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
c350: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
c360: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c370: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
c380: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
c390: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
c3a0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
c3b0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
c3c0: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
c3d0: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
c3e0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
c3f0: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
c400: 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d  if( NEVER(pTab==
c410: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
c420: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
c430: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
c440: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
c450: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
c460: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
c470: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
c480: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c490: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
c4a0: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
c4b0: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
c4c0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
c4d0: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
c4e0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
c4f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
c500: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
c510: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
c520: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c530: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
c540: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
c550: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
c560: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
c570: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c580: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c590: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
c5a0: 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
c5b0: 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
c5c0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
c5d0: 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
c5e0: 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
c5f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
c600: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
c610: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
c620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
c630: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
c640: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c650: 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
c660: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
c670: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
c680: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
c690: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
c6a0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
c6b0: 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  +);.}../*.** Gen
c6c0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
c6d0: 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d  checks the left-
c6e0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  most column of i
c6f0: 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20  ndex table iCur 
c700: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20  to see if.** it 
c710: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
c720: 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73  L entries.  Caus
c730: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61  e the register a
c740: 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20  t regHasNull to 
c750: 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e  be set.** to a n
c760: 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
c770: 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e   iCur contains n
c780: 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20  o NULLs.  Cause 
c790: 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e  register regHasN
c7a0: 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74  ull.** to be set
c7b0: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72   to NULL if iCur
c7c0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
c7d0: 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
c7e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c7f0: 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e  d sqlite3SetHasN
c800: 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c  ullFlag(Vdbe *v,
c810: 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72   int iCur, int r
c820: 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e  egHasNull){.  in
c830: 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74 65 33 56  t j1;.  sqlite3V
c840: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c850: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48  Integer, 0, regH
c860: 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20 3d 20  asNull);.  j1 = 
c870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c880: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
c890: 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
c8a0: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
c8b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c8c0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
c8d0: 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
c8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c8f0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
c900: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
c910: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
c920: 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
c930: 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
c940: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c950: 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a 23 69  e(v, j1);.}...#i
c960: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c970: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
c980: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
c990: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
c9a0: 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
c9b0: 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
c9c0: 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
c9d0: 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
c9e0: 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
c9f0: 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
ca00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
ca10: 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
ca20: 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
ca30: 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
ca40: 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
ca50: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
ca60: 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
ca70: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
ca80: 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
ca90: 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
caa0: 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
cab0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
cac0: 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
cad0: 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
cae0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
caf0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
cb00: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
cb10: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
cb20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
cb30: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
cb40: 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
cb50: 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
cb60: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
cb70: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
cb80: 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
cb90: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
cba0: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
cbb0: 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
cbc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
cbd0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
cbe0: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
cbf0: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
cc00: 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
cc10: 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
cc20: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
cc30: 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
cc40: 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
cc50: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
cc60: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
cc70: 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
cc80: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
cc90: 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
cca0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
ccb0: 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
ccc0: 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
ccd0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
cce0: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
ccf0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
cd00: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
cd10: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
cd20: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
cd30: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
cd40: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
cd50: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
cd60: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
cd70: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
cd80: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
cd90: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
cda0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
cdb0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
cdc0: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
cdd0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
cde0: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
cdf0: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
ce00: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
ce10: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
ce20: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
ce30: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
ce40: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
ce50: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
ce60: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
ce70: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
ce80: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
ceb0: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
cec0: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
ced0: 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
cee0: 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
cef0: 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
cf00: 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
cf10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
cf20: 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
cf30: 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
cf40: 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
cf50: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
cf60: 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
cf70: 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
cf80: 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
cf90: 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
cfa0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
cfb0: 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
cfc0: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
cfd0: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
cfe0: 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
cff0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d000: 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
d010: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
d020: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
d030: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
d040: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
d050: 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
d060: 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
d070: 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
d080: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
d090: 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
d0a0: 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
d0b0: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
d0c0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
d0d0: 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
d0e0: 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
d0f0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
d100: 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
d110: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
d120: 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
d130: 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
d140: 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
d150: 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
d160: 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
d170: 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
d180: 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
d190: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
d1a0: 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
d1b0: 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
d1c0: 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
d1d0: 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
d1e0: 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
d1f0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
d200: 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
d210: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
d220: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
d230: 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
d240: 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
d250: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
d260: 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
d270: 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
d280: 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
d290: 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
d2a0: 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
d2b0: 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
d2c0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
d2d0: 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
d2e0: 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20  lected <column> 
d2f0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
d300: 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
d310: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
d320: 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
d330: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69  PRIMARY KEY or i
d340: 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55  t.** has a UNIQU
d350: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
d360: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a  UNIQUE index..**
d370: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
d380: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
d390: 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
d3a0: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
d3b0: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
d3c0: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
d3d0: 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
d3e0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
d3f0: 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
d400: 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  less <column> is
d410: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d420: 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e  ARY KEY or an in
d430: 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66  dex can .** be f
d440: 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d  ound with <colum
d450: 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  n> as its left-m
d460: 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  ost column..**.*
d470: 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
d480: 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
d490: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
d4a0: 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
d4b0: 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
d4c0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d4d0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
d4e0: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
d4f0: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
d500: 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
d510: 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
d520: 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
d530: 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
d540: 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
d550: 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
d560: 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
d570: 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
d580: 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
d590: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
d5a0: 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
d5b0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
d5c0: 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
d5d0: 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
d5e0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
d5f0: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
d600: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
d610: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
d620: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
d630: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
d640: 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
d650: 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
d660: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
d670: 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
d680: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
d690: 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
d6a0: 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
d6b0: 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
d6c0: 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
d6d0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
d6e0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
d6f0: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
d700: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
d710: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
d720: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
d730: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
d740: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
d750: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
d760: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
d770: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
d780: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
d790: 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
d7a0: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
d7b0: 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
d7c0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
d7d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
d7e0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
d7f0: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
d800: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
d810: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
d820: 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
d830: 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
d840: 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
d850: 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
d860: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
d870: 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
d880: 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
d890: 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
d8a0: 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
d8b0: 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
d8c0: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
d8d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d8e0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
d8f0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
d900: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
d910: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75  rse, Expr *pX, u
d920: 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20  32 inFlags, int 
d930: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a  *prRhsHasNull){.
d940: 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
d970: 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
d980: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
d990: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
d9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
d9c0: 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
d9d0: 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
d9e0: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
d9f0: 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
da00: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
da10: 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
da20: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
da30: 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
da40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
da50: 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
da60: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
da70: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
da80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
da90: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
daa0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
dab0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
dac0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
dad0: 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65  ;.  mustBeUnique
dae0: 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e   = (inFlags & IN
daf0: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b  _INDEX_LOOP)!=0;
db00: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
db10: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
db20: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
db30: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
db40: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
db50: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
db60: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
db70: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
db80: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
db90: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70   table..  */.  p
dba0: 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65   = (ExprHasPrope
dbb0: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
dbc0: 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53  lect) ? pX->x.pS
dbd0: 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66  elect : 0);.  if
dbe0: 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d  ( ALWAYS(pParse-
dbf0: 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43  >nErr==0) && isC
dc00: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
dc10: 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (p) ){.    sqlit
dc20: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
dc30: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
dc40: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
dc50: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
dc60: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
dc90: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
dca0: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
dcd0: 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  sion <column> */
dce0: 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b 20 20  .    i16 iCol;  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
dd10: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c  ndex of column <
dd20: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
dd30: 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  16 iDb;         
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
dd60: 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a  e idx for pTab *
dd70: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
dd80: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
dd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
dda0: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
ddb0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
ddc0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
ddd0: 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ->pEList!=0 );  
dde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
ddf0: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
de00: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
de10: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
de20: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
de30: 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65  Expr!=0 ); /* Be
de40: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
de50: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
de60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
de70: 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20  ->pSrc!=0 );    
de80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
de90: 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69  cause of isCandi
dea0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20  dateForInOpt(p) 
deb0: 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d  */.    pTab = p-
dec0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
ded0: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d  ;.    pExpr = p-
dee0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
def0: 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  xpr;.    iCol = 
df00: 28 69 31 36 29 70 45 78 70 72 2d 3e 69 43 6f 6c  (i16)pExpr->iCol
df10: 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20  umn;.   .    /* 
df20: 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73  Code an OP_Trans
df30: 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61  action and OP_Ta
df40: 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62  bleLock for <tab
df50: 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20  le>. */.    iDb 
df60: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
df70: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
df80: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73  >pSchema);.    s
df90: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
dfa0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
dfb0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
dfc0: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
dfd0: 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
dfe0: 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
dff0: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  e);..    /* This
e000: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
e010: 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77  y called from tw
e020: 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74  o places. In bot
e030: 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65  h cases the vdbe
e040: 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  .    ** has alre
e050: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
e060: 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71  ed. So assume sq
e070: 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69  lite3GetVdbe() i
e080: 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20  s always.    ** 
e090: 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e  successful here.
e0a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
e0b0: 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69  rt(v);.    if( i
e0c0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  Col<0 ){.      i
e0d0: 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
e0e0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
e0f0: 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
e100: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
e110: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
e120: 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
e130: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
e140: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
e150: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
e160: 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
e170: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e180: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
e190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
e1a0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
e1d0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
e1e0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
e1f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
e200: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
e210: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
e220: 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
e230: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
e240: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
e250: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
e260: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
e270: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
e280: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
e290: 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f  ce.  */.      Co
e2a0: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
e2b0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
e2c0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
e2d0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
e2e0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
e2f0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
e300: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
e310: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
e320: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
e330: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
e340: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
e350: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
e360: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
e370: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
e380: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
e390: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
e3a0: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
e3b0: 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f     int affinity_
e3c0: 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ok = sqlite3Inde
e3d0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
e3e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
e3f0: 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20  .affinity);..   
e400: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
e410: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
e420: 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
e430: 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
e440: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e450: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d        if( (pIdx-
e460: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43  >aiColumn[0]==iC
e470: 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  ol).         && 
e480: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
e490: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
e4a0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c  pIdx->azColl[0],
e4b0: 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20   0)==pReq.      
e4c0: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
e4d0: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
e4e0: 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73 55  KeyCol==1 && IsU
e4f0: 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
e500: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
e510: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
e520: 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
e530: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
e540: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
e550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e560: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e570: 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
e580: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e5a0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
e5b0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
e5c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
e5d0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
e5e0: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
e5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
e600: 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  rt( IN_INDEX_IND
e610: 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e  EX_DESC == IN_IN
e620: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20  DEX_INDEX_ASC+1 
e630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79  );.          eTy
e640: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  pe = IN_INDEX_IN
e650: 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e  DEX_ASC + pIdx->
e660: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a  aSortOrder[0];..
e670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
e680: 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 21 70  RhsHasNull && !p
e690: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
e6a0: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
e6b0: 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73         *prRhsHas
e6c0: 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
e6d0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
e6e0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
e6f0: 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62  NullFlag(v, iTab
e700: 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  , *prRhsHasNull)
e710: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e730: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
e740: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Addr);.        }
e750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e760: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70   }..  /* If no p
e770: 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  reexisting index
e780: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   is available fo
e790: 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a  r the IN clause.
e7a0: 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45    ** and IN_INDE
e7b0: 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c  X_NOOP is an all
e7c0: 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20  owed reply.  ** 
e7d0: 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20 74  and the RHS of t
e7e0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
e7f0: 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20  s a list, not a 
e800: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e  subquery.  ** an
e810: 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74  d the RHS is not
e820: 20 63 6f 6e 74 61 6e 74 20 6f 72 20 68 61 73 20   contant or has 
e830: 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72  two or fewer ter
e840: 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  ms,.  ** then it
e850: 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72   is not worth cr
e860: 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  eating an epheme
e870: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61  ral table to eva
e880: 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49  luate.  ** the I
e890: 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65  N operator so re
e8a0: 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
e8b0: 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  OP..  */.  if( e
e8c0: 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69  Type==0.   && (i
e8d0: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
e8e0: 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26  X_NOOP_OK).   &&
e8f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
e900: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
e910: 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69  ct).   && (!sqli
e920: 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
e930: 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e  nt(pX) || pX->x.
e940: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29  pList->nExpr<=2)
e950: 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20  .  ){.    eType 
e960: 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b  = IN_INDEX_NOOP;
e970: 0a 20 20 7d 0a 20 20 20 20 20 0a 0a 20 20 69 66  .  }.     ..  if
e980: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
e990: 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66    /* Could not f
e9a0: 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ind an existing 
e9b0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
e9c0: 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48 53  o use as the RHS
e9d0: 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20   b-tree..    ** 
e9e0: 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  We will have to 
e9f0: 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65  generate an ephe
ea00: 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64  meral table to d
ea10: 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a  o the job..    *
ea20: 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 4e  /.    u32 savedN
ea30: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
ea40: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
ea50: 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65      int rMayHave
ea60: 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54  Null = 0;.    eT
ea70: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
ea80: 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c  PH;.    if( inFl
ea90: 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c  ags & IN_INDEX_L
eaa0: 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OOP ){.      pPa
eab0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
eac0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
ead0: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
eae0: 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73 50  n<0 && !ExprHasP
eaf0: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
eb00: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
eb10: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
eb20: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20  INDEX_ROWID;.   
eb30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
eb40: 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
eb50: 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48  ){.      *prRhsH
eb60: 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76  asNull = rMayHav
eb70: 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
eb80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
eb90: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
eba0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
ebb0: 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  X, rMayHaveNull,
ebc0: 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
ebd0: 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61  _ROWID);.    pPa
ebe0: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
ebf0: 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  = savedNQueryLoo
ec00: 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
ec10: 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
ec20: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
ec30: 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
ec40: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ec50: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
ec60: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
ec70: 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
ec80: 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
ec90: 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
eca0: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
ecb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
ecc0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
ecd0: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
ece0: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
ecf0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
ed00: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
ed10: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
ed20: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
ed30: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
ed40: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
ed50: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
ed60: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
ed70: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
ed80: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
ed90: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
eda0: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
edb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
edc0: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
edd0: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
ede0: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
edf0: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
ee00: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
ee10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
ee20: 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
ee30: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
ee40: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
ee50: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
ee60: 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
ee70: 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
ee80: 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
ee90: 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
eea0: 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
eeb0: 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
eec0: 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
eed0: 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
eee0: 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
eef0: 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
ef00: 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
ef10: 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
ef20: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
ef30: 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
ef40: 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
ef50: 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
ef60: 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
ef70: 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
ef80: 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
ef90: 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
efa0: 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
efb0: 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
efc0: 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
efd0: 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
efe0: 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
eff0: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
f000: 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
f010: 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
f020: 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
f030: 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
f040: 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
f050: 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
f060: 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
f070: 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
f080: 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
f090: 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
f0a0: 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
f0b0: 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
f0c0: 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
f0d0: 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
f0e0: 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
f0f0: 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
f100: 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f    For IN operato
f110: 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  rs or if an erro
f120: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65  r occurs, the re
f130: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e  turn value is 0.
f140: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
f150: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f160: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
f170: 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
f180: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f190: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f1a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
f1b0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
f1c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
f1d0: 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
f1e0: 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
f1f0: 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  int rHasNullFlag
f200: 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
f210: 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
f220: 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
f230: 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
f240: 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
f250: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
f260: 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
f270: 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
f280: 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a  id */.){.  int j
f290: 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
f2a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f2b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
f2c0: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
f2d0: 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
f2e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f300: 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67  Register storing
f310: 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20   resulting */.  
f320: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
f330: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f340: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
f350: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
f360: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
f370: 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
f380: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
f390: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
f3a0: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
f3b0: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
f3c0: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
f3d0: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
f3e0: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
f3f0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
f400: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
f410: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
f420: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
f430: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
f440: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
f450: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
f460: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
f470: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
f480: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
f490: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
f4a0: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
f4b0: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
f4c0: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
f4d0: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
f4e0: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
f4f0: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
f500: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
f510: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
f520: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
f530: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
f540: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
f550: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
f560: 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44  t) ){.    jmpIfD
f570: 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33  ynamic = sqlite3
f580: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
f590: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f5a0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
f5b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
f5c0: 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65  AIN.  if( pParse
f5d0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
f5e0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
f5f0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f600: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
f610: 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73  >db, "EXECUTE %s
f620: 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
f630: 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
f640: 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
f650: 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ",.        pExpr
f660: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53  ->op==TK_IN?"LIS
f670: 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61  T":"SCALAR", pPa
f680: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
f690: 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  Id.    );.    sq
f6a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
f6b0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
f6c0: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
f6d0: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
f6e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23  _DYNAMIC);.  }.#
f6f0: 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28  endif..  switch(
f700: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
f710: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
f720: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
f730: 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
f740: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
f750: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
f760: 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  IN */.      int 
f770: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
f780: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
f790: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
f7a0: 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
f7b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
f7c0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
f7d0: 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
f7e0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
f7f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
f800: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
f810: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
f820: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
f830: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
f840: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
f850: 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a  finity(pLeft);..
f860: 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
f870: 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
f880: 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
f890: 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
f8a0: 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
f8b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
f8c0: 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
f8d0: 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d  e way.  An ephem
f8e0: 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  eral table is . 
f8f0: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
f900: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
f910: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
f920: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
f930: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
f940: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
f950: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
f960: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
f970: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
f980: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
f990: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
f9a0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
f9b0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
f9c0: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
f9d0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
f9e0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
f9f0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
fa00: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
fa10: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
fa20: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
fa30: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
fa40: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
fa50: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
fa60: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
fa70: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
fa80: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
fa90: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
faa0: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
fab0: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
fac0: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
fad0: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
fae0: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
faf0: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
fb00: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
fb10: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
fb20: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
fb30: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
fb40: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
fb50: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
fb60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fb70: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
fb80: 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  eral, pExpr->iTa
fb90: 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a  ble, !isRowid);.
fba0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
fbb0: 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
fbc0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
fbd0: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 31  oc(pParse->db, 1
fbe0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
fbf0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
fc00: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
fc10: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
fc20: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
fc30: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
fc40: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
fc50: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
fc60: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
fc70: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
fc80: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
fc90: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
fca0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
fcb0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
fcc0: 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
fcd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
fce0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
fcf0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
fd00: 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  t;.        Selec
fd10: 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
fd20: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
fd30: 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61  List;..        a
fd40: 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
fd50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
fd60: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
fd70: 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
fd80: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
fd90: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66  .        dest.af
fda0: 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66 69  fSdst = (u8)affi
fdb0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73  nity;.        as
fdc0: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
fdd0: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
fde0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
fdf0: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65  );.        pSele
fe00: 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
fe10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
fe20: 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
fe30: 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
fe40: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
fe50: 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
fe60: 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
fe70: 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
fe80: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
fe90: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
fea0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
feb0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
fec0: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
fed0: 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
fee0: 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
fef0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ff00: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
ff10: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
ff20: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
ff30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ff40: 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
ff50: 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
ff60: 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
ff70: 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
ff80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ff90: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
ffa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
ffb0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
ffc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ffd0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
ffe0: 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
fff0: 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  fo) );.        p
10000 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
10010 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
10020 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
10030 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10040 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10080 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
10090 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
100a0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
100b0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
100c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
100d0 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
100e0 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
100f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
10100 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
10110 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
10120 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
10130 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
10140 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
10150 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
10160 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
10170 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
10180 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
10190 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
101a0 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
101b0 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
101c0 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
101d0 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
101e0 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
101f0 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
10200 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
10210 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
10220 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10230 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
10240 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
10250 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
10260 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
10270 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
10280 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r3;..        if
10290 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
102a0 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
102b0 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
102c0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
102d0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
102e0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
102f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10300 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
10310 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
10320 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
10330 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
10340 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10350 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
10360 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
10370 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
10380 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
10390 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
103a0 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
103b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
103c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
103d0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
103e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
103f0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10400 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
10410 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  d ) sqlite3VdbeA
10420 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
10430 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
10440 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
10450 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
10460 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
10470 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
10480 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
10490 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
104a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
104b0 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
104c0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
104d0 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
104e0 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
104f0 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
10500 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
10510 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
10520 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
10530 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
10540 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
10550 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
10560 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
10570 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
10580 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
10590 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
105a0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
105b0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
105c0 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
105d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
105e0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
105f0 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
10600 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
10610 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10620 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10630 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
10640 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
10650 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
10660 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
10670 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
10680 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
10690 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
106a0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
106b0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
106c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
106d0 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
106e0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
106f0 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
10700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
10710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10720 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
10730 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10740 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
10750 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
10760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
10770 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10780 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
10790 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
107a0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
107b0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
107c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
107d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
107e0 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10810 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10820 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
10830 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
10840 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
10850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10860 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10870 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
10880 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
10890 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
108a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
108b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
108c0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
108d0 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
108e0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
108f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10900 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
10910 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
10920 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
10930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10950 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
10960 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
10970 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10990 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
109a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
109b0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
109d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
109e0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
109f0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
10a00 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
10a10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10a20 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
10a30 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
10a40 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
10a50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10a60 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
10a70 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
10a80 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
10a90 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
10aa0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68      /* If this h
10ab0 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
10ac0 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
10ad0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
10ae0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
10af0 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
10b00 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
10b10 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
10b20 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
10b30 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
10b40 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
10b50 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20    If this is an 
10b60 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20  EXISTS, write.  
10b70 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
10b80 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
10b90 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69   or 1 (exists) i
10ba0 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
10bb0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  l.      ** and r
10bc0 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72  ecord that memor
10bd0 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
10be0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
10bf0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
10c20 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
10c30 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
10c40 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
10c70 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
10c80 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20  result */..     
10c90 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
10ca0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
10cb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10cc0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
10cd0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
10ce0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10cf0 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
10d00 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
10d10 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20  ELECT );..      
10d20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
10d30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
10d40 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
10d50 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
10d60 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
10d70 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10d80 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10d90 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
10da0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
10db0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
10dc0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
10dd0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
10de0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
10df0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
10e00 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
10e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e20 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
10e30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
10e40 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
10e50 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
10e60 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
10e70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10e80 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
10e90 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
10ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10eb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10ec0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
10ed0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
10ee0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10ef0 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
10f00 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
10f10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10f20 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
10f30 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
10f40 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
10f50 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
10f60 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10f70 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
10f80 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74       &sqlite3Int
10fb0 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20  Tokens[1]);.    
10fc0 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
10fd0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
10fe0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
10ff0 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
11000 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11010 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
11020 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
11030 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
11040 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
11050 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
11060 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
11070 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11080 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
11090 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
110a0 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
110b0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
110c0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
110d0 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
110e0 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
110f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11100 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
11110 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
11120 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
11130 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
11140 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
11150 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11160 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
11170 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11180 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
11190 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
111a0 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
111b0 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
111c0 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
111d0 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
111e0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
111f0 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
11200 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
11210 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
11220 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
11230 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
11240 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
11250 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
11260 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
11270 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11280 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
11290 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
112a0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
112b0 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
112c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
112d0 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
112e0 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
112f0 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
11300 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
11310 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
11320 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
11330 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
11340 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
11350 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
11360 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
11370 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
11380 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
11390 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
113a0 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
113b0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
113c0 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
113d0 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
113e0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
113f0 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
11400 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
11410 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
11420 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
11430 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
11440 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
11450 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
11460 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
11470 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
11480 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
11490 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
114a0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
114b0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
114c0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
114d0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
114e0 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
114f0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
11500 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
11510 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
11520 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
11530 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
11540 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
11550 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
11560 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
11570 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
11580 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
11590 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
115a0 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
115b0 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
115c0 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
115d0 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
115e0 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  s */.  char affi
115f0 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  nity;        /* 
11600 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e  Comparison affin
11610 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ity to use */.  
11620 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
11630 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
11640 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
11650 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
11660 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
11670 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
11680 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11690 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
116a0 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
116b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  truction */..  /
116c0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48  * Compute the RH
116d0 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20  S.   After this 
116e0 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20  step, the table 
116f0 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a  with cursor.  **
11700 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77   pExpr->iTable w
11710 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ill contains the
11720 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
11730 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20  e up the RHS..  
11740 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
11750 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
11760 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
11770 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
11780 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
11790 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
117a0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
117b0 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
117c0 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
117d0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
117e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
11810 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
11820 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
11830 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
11860 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
11870 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20  RhsHasNull);..  
11880 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
11890 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
118a0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
118b0 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
118c0 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65  ts.  ** of the e
118d0 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
118e0 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
118f0 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
11900 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20  itable for.  ** 
11910 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P4 of OP_MakeRec
11920 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69  ord..  */.  affi
11930 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
11940 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
11950 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  ;..  /* Code the
11960 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
11970 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
11980 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20   (...)"..  */.  
11990 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
119a0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
119b0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
119c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
119d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
119e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
119f0 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20  >pLeft, r1);..  
11a00 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
11a10 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
11a20 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
11a30 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
11a40 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
11a50 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
11a60 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
11a70 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
11a80 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
11a90 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
11aa0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
11ab0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
11ac0 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
11ad0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
11ae0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
11af0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11b00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11b10 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
11b20 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
11b30 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
11b40 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11b50 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
11b60 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
11b70 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
11b80 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
11b90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
11ba0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11bb0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
11bc0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
11bd0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
11be0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
11bf0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
11c00 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11c10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
11c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11c30 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
11c40 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
11c50 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11c60 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
11c70 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
11c80 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
11c90 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
11ca0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
11cb0 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
11cc0 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
11cd0 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
11ce0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
11cf0 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
11d00 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
11d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11d20 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
11d30 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
11d40 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
11d50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
11d60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
11d70 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
11d80 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
11d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11da0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
11db0 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
11dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
11de0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
11df0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
11e00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
11e10 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
11e20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
11e30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
11e40 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
11e50 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
11e60 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11e70 76 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  v, affinity);.  
11e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11e90 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
11ea0 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
11eb0 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
11ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11ed0 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65  v, OP_Ne, r1, de
11ee0 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
11f10 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
11f20 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
11f30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
11f40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
11f50 28 76 2c 20 61 66 66 69 6e 69 74 79 20 7c 20 53  (v, affinity | S
11f60 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
11f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11f80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
11f90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11fa0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
11fb0 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
11fc0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
11fd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11fe0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
11ff0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
12000 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
12010 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
12020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12030 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
12040 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
12050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
12060 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
12070 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
12080 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12090 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
120a0 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
120b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
120c0 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68   LHS is NULL, th
120d0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
120e0 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72   either false or
120f0 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a   NULL depending.
12100 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65      ** on whethe
12110 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
12120 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
12130 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ctively..    */.
12140 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12150 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78  xprCanBeNull(pEx
12160 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20  pr->pLeft) ){.  
12170 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
12180 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
12190 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ){.        /* Sh
121a0 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
121b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
121c0 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e   the false and N
121d0 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65  ULL outcomes are
121e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
121f0 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
12200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12210 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
12220 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
12230 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12240 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12250 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
12260 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12270 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
12280 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
12290 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
122a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
122b0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
122c0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
122d0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
122e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
122f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12310 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
12320 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
12330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12340 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12350 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
12360 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65    }.  .    if( e
12370 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
12380 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
12390 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
123a0 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
123b0 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
123c0 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ree.      */.   
123d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
123e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
123f0 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66  eInt, r1, destIf
12400 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65  False); VdbeCove
12410 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
12420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12430 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
12440 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
12450 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
12460 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
12470 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
12480 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
12490 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
124a0 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
124b0 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f  b-tree..      */
124c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
124d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
124e0 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20  ffinity, r1, 1, 
124f0 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
12500 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
12510 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
12520 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20  hip test fails, 
12530 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12540 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
12550 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
12560 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
12570 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
12580 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
12590 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
125a0 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
125b0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
125c0 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
125d0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61   .      ** conta
125e0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
125f0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
12600 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
12610 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  the.      ** exp
12620 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
12630 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  NULL..      */. 
12640 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
12650 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66  tIfFalse!=destIf
12660 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e  Null || rRhsHasN
12670 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
12680 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d  if( rRhsHasNull=
12690 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
126a0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
126b0 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
126c0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
126d0 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20   that the RHS.  
126e0 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
126f0 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c  contain NULL val
12700 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
12710 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
12720 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
12730 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
12740 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
12750 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
12760 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
12770 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69   ** Also run thi
12780 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c  s branch if NULL
12790 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
127a0 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20  o FALSE.        
127b0 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74  ** for this part
127c0 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74  icular IN operat
127d0 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
127e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
127f0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
12800 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
12810 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
12820 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a  fFalse, r1, 1);.
12830 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12840 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
12850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
12860 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c   In this branch,
12870 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
12880 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  IN might contain
12890 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20   a NULL and.    
128a0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
128b0 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
128c0 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
128d0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
128e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
128f0 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a  tcome..        *
12900 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31  /.        int j1
12910 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
12920 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
12930 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ee if the LHS is
12940 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12950 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20  e RHS.  If so,. 
12960 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
12970 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52 55  he answer is TRU
12980 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  E the presence o
12990 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
129a0 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  HS does.        
129b0 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  ** not matter.  
129c0 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  If the LHS is no
129d0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
129e0 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65  he RHS, then the
129f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77  .        ** answ
12a00 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  er is NULL if th
12a10 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  e RHS contains N
12a20 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73  ULLs and the ans
12a30 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a  wer is.        *
12a40 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 52  * FALSE if the R
12a50 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
12a60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12a70 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
12a80 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
12a90 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
12aa0 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c  ->iTable, 0, r1,
12ab0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
12ac0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12ae0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
12af0 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
12b00 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  l, destIfNull);.
12b10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12b20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
12b50 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
12b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12b70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
12b80 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
12b90 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
12ba0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12bb0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
12bc0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
12bd0 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
12be0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
12bf0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23   IN expr"));.}.#
12c00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12c10 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12c20 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
12c30 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
12c40 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
12c50 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
12c60 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
12c70 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
12c80 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
12c90 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
12ca0 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
12cb0 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
12cc0 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
12cd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
12ce0 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ut;.}..#ifndef S
12cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
12d00 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
12d10 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
12d20 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
12d30 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
12d40 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
12d50 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
12d60 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
12d70 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
12d80 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
12d90 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
12da0 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
12db0 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
12dc0 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
12dd0 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
12de0 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
12df0 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
12e00 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
12e10 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
12e20 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
12e30 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
12e40 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
12e50 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
12e60 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
12e70 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
12e80 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
12e90 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
12ea0 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
12eb0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
12ec0 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
12ed0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
12ee0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
12ef0 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
12f00 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
12f10 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
12f20 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
12f30 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
12f40 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
12f50 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
12f60 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
12f70 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
12f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f90 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
12fa0 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
12fb0 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
12fc0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
12fd0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
12fe0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
12ff0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
13000 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
13010 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
13020 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
13030 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
13040 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
13050 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
13060 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
13070 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
13080 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
13090 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
130a0 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
130b0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
130c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
130d0 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
130e0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
130f0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
13100 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
13110 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
13120 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
13130 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
13140 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
13150 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13160 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
13170 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
13180 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
13190 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
131a0 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
131b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
131c0 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
131d0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
131e0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
131f0 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
13200 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
13210 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
13220 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
13230 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
13240 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
13250 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
13260 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
13270 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
13280 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
13290 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
132a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
132b0 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
132c0 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54  m, 0, zV, P4_INT
132d0 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
132e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
132f0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13300 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
13310 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13320 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
13330 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
13340 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
13350 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
13360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
13370 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
13380 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
13390 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
133a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
133b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
133c0 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
133d0 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a   too big: %s", z
133e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
133f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
13400 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
13410 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
13420 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
13430 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
13440 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63  ./*.** Clear a c
13450 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ache entry..*/.s
13460 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
13470 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
13480 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
13490 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a   yColCache *p){.
134a0 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67    if( p->tempReg
134b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
134c0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
134d0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
134e0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
134f0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
13500 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
13510 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67  Reg++] = p->iReg
13520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
13530 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a  empReg = 0;.  }.
13540 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
13550 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
13560 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
13570 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
13580 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
13590 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
135a0 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
135b0 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
135c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
135d0 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
135e0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
135f0 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
13600 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
13610 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
13620 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
13630 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
13640 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p;..  /* Unles
13650 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  s an error has o
13660 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65  ccurred, registe
13670 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  r numbers are al
13680 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a  ways positive. *
13690 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67  /.  assert( iReg
136a0 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  >0 || pParse->nE
136b0 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
136c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
136d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
136e0 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37  >=-1 && iCol<327
136f0 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65  68 );  /* Finite
13700 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   column numbers 
13710 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  */..  /* The SQL
13720 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
13730 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68  flag disables th
13740 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20  e column cache. 
13750 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
13760 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ** for testing o
13770 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20  nly - to verify 
13780 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61  that SQLite alwa
13790 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65  ys gets the same
137a0 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74   answer.  ** wit
137b0 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68  h and without th
137c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
137d0 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d    */.  if( Optim
137e0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
137f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
13800 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20  TE_ColumnCache) 
13810 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
13820 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
13830 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
13840 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ..  **.  ** Actu
13850 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68  ally, the way th
13860 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69  e column cache i
13870 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  s currently used
13880 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74  , we are guarant
13890 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  eed.  ** that th
138a0 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65  e object will ne
138b0 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69  ver already be i
138c0 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79  n cache.  Verify
138d0 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e   this guarantee.
138e0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
138f0 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20  EBUG.  for(i=0, 
13900 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
13910 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
13920 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
13930 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
13940 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
13950 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
13960 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
13970 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
13980 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
13990 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
139a0 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
139b0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
139c0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
139d0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
139e0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
139f0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
13a00 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
13a10 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
13a20 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
13a30 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
13a40 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
13a50 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
13a60 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
13a70 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
13a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
13a90 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
13aa0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
13ab0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
13ac0 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
13ad0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
13ae0 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
13af0 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
13b00 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
13b10 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
13b20 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
13b30 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
13b40 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
13b50 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
13b60 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
13b70 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
13b80 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
13b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13ba0 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
13bb0 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
13bc0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13bd0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
13be0 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
13bf0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
13c00 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
13c10 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
13c20 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
13c30 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
13c40 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
13c50 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
13c60 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
13c70 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Cnt++;.    retur
13c80 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n;.  }.}../*.** 
13c90 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
13ca0 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
13cb0 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
13cc0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
13cd0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
13ce0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
13cf0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
13d00 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
13d10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13d20 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
13d30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13d40 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
13d50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
13d60 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b  t iLast = iReg +
13d70 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72   nReg - 1;.  str
13d80 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
13d90 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
13da0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13db0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
13dc0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
13dd0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
13de0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
13df0 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61  >=iReg && r<=iLa
13e00 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  st ){.      cach
13e10 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
13e20 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
13e30 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
13e40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
13e50 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
13e60 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
13e70 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
13e80 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
13e90 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
13ea0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
13eb0 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
13ec0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
13ed0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
13ee0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
13ef0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13f00 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
13f10 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
13f20 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
13f30 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
13f40 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
13f50 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
13f60 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
13f70 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
13f80 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
13f90 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
13fa0 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
13fb0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13fc0 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
13fd0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
13fe0 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
13ff0 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
14000 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
14010 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
14020 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
14030 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
14040 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
14050 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
14060 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
14070 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
14080 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
14090 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
140a0 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
140b0 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
140c0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
140d0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
140e0 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
140f0 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70  eLevel>=1 );.  p
14100 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14110 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c  el--;.#ifdef SQL
14120 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
14130 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
14140 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
14150 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
14160 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f   printf("POP  to
14170 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
14180 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
14190 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
141a0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
141b0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
141c0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
141d0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
141e0 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
141f0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
14200 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
14210 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
14220 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
14230 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
14240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14250 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
14260 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
14270 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
14280 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
14290 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
142a0 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
142b0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
142c0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
142d0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
142e0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
142f0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
14300 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
14310 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
14320 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
14330 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
14340 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
14350 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
14360 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
14370 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14380 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14390 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
143a0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
143b0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
143c0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
143d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
143e0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
143f0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
14400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14410 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14420 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
14430 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
14440 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
14450 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
14460 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
14470 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
14480 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
14490 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
144a0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
144b0 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
144c0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
144d0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
144e0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
144f0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
14500 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
14510 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
14520 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
14530 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
14540 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
14550 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
14560 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
14570 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
14580 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
14590 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
145a0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
145b0 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  ){.  if( iCol<0 
145c0 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
145d0 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
145e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
145f0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
14600 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
14610 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
14620 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
14630 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
14640 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
14650 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
14660 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
14670 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
14680 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
14690 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
146a0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
146b0 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
146c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
146d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
146e0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
146f0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
14700 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
14710 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
14720 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
14730 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
14740 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14750 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
14760 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
14770 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
14780 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
14790 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
147a0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
147b0 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
147c0 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
147d0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
147e0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
147f0 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
14800 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
14810 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
14820 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
14830 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
14840 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
14850 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
14860 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
14870 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
14880 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
14890 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
148a0 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
148b0 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
148c0 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
148d0 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
148e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
148f0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
14900 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14910 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
14920 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
14930 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
14940 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
14950 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
14960 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
14970 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
14980 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
14990 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
149a0 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
149b0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
149c0 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
149d0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
149e0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
149f0 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
14a00 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
14a10 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
14a20 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
14a30 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
14a40 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  P_Column */.){. 
14a50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14a60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14a70 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
14a80 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
14a90 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14aa0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14ab0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
14ac0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14ad0 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20  f( p->iReg>0 && 
14ae0 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
14af0 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
14b00 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
14b10 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
14b20 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
14b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14b40 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
14b50 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
14b60 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
14b70 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
14b80 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
14b90 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
14ba0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
14bb0 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
14bc0 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
14bd0 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
14be0 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
14bf0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
14c00 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
14c10 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
14c20 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
14c30 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
14c40 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
14c50 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
14c60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
14c70 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
14c80 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
14c90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14ca0 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
14cb0 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
14cc0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
14cd0 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c 49  he *p;..#if SQLI
14ce0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
14cf0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
14d00 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
14d10 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14d20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22  printf("CLEAR\n"
14d30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14d40 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
14d50 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
14d60 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14d70 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14d80 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b    if( p->iReg ){
14d90 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
14da0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
14db0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
14dc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
14dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
14de0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
14df0 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
14e00 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
14e10 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
14e20 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
14e30 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
14e40 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
14e50 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
14e60 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
14e70 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
14e80 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
14e90 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
14ea0 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
14eb0 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
14ec0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14ed0 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
14ee0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
14ef0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
14f00 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
14f10 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
14f20 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
14f30 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
14f40 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
14f50 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
14f60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14f70 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
14f80 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
14f90 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
14fa0 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
14fb0 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
14fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14fd0 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
14fe0 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
14ff0 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
15000 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15010 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
15020 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
15030 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
15040 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
15050 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
15060 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
15070 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
15080 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
15090 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
150a0 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
150b0 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
150c0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
150d0 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
150e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
150f0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
15100 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
15110 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
15120 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
15130 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
15140 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
15150 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
15160 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
15170 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
15180 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
15190 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
151a0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
151b0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
151c0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
151d0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
151e0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
151f0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
15200 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
15210 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
15220 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
15230 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
15240 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
15250 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
15260 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
15270 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a  AGE_TEST */../*.
15280 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78  ** Convert an ex
15290 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
152a0 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a   a TK_REGISTER.*
152b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
152c0 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
152d0 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
152e0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
152f0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
15300 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
15310 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
15320 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
15330 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
15340 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15350 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
15360 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
15370 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
15380 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
15390 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
153a0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
153b0 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
153c0 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
153d0 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
153e0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
153f0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
15400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
15410 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
15420 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74  ntee that result
15430 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
15440 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
15450 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
15460 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
15470 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
15480 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
15490 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
154a0 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
154b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
154c0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
154d0 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
154e0 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
154f0 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
15500 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
15510 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
15520 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
15530 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
15540 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
15550 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15560 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
15570 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
15580 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
15590 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
155a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
155b0 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
155c0 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
155d0 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
155e0 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
155f0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
15600 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
15610 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
15620 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
15630 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
15640 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
15650 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
15660 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
15670 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
15680 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
15690 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
156a0 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34  t r1, r2, r3, r4
156b0 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  ;       /* Vario
156c0 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
156d0 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ers */.  sqlite3
156e0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
156f0 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
15700 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
15710 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15730 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
15740 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20  sion node */..  
15750 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
15760 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
15770 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
15780 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
15790 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
157a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
157b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
157c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
157d0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
157e0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
157f0 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
15800 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
15810 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
15820 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
15830 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
15840 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
15850 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
15860 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
15870 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
15880 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
15890 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
158a0 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
158b0 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
158c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
158d0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
158e0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
158f0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
15900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15910 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
15920 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
15930 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
15940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15950 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
15960 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
15970 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
159a0 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
159b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
159c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
159d0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
159e0 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
159f0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
15a00 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
15a10 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
15a20 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
15a30 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
15a40 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
15a50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
15a60 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
15a70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
15a80 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
15a90 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
15aa0 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
15ab0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
15ac0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
15ad0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
15ae0 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
15af0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
15b00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
15b10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
15b20 2a 20 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20  * Deleting from 
15b30 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
15b40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61  */.          iTa
15b50 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 61 72  b = pParse->iPar
15b60 74 49 64 78 54 61 62 3b 0a 20 20 20 20 20 20 20  tIdxTab;.       
15b70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15b80 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
15b90 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
15ba0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
15bb0 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
15be0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67  lumn, iTab, targ
15bf0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a     pExpr->op2);.
15c20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15c30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
15c40 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
15c50 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
15c60 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
15c70 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
15c80 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
15c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
15ca0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
15cb0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
15cc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15cd0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15ce0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15cf0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
15d00 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
15d10 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
15d20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
15d30 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
15d40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
15d50 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
15d60 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
15d70 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15d80 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
15d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15da0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
15db0 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30  g8, 0, target, 0
15dc0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
15dd0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
15de0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15df0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
15e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15e10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15e20 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15e50 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
15e60 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
15e70 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
15e80 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
15e90 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
15ea0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
15eb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15ec0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15ed0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
15ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15ef0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
15f00 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
15f10 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
15f20 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
15f30 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
15f40 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
15f50 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
15f60 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
15f70 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
15f80 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
15f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
15fa0 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
15fb0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
15fc0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
15fd0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
15fe0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
15ff0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16000 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
16010 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
16020 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
16030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16040 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
16050 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
16060 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16070 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16080 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16090 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
160a0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
160b0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
160c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
160d0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
160e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
160f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
16100 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
16110 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
16120 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16130 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
16140 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16150 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16160 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
16170 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
16180 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
16190 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
161a0 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
161b0 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
161c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
161d0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
161e0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
161f0 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
16200 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
16210 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16220 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16230 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
16240 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
16250 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
16260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16270 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
16280 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
16290 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
162a0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
162b0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
162c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
162d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
162e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
162f0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
16300 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
16310 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
16320 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
16330 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
16340 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
16350 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
16360 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
16370 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
16380 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
16390 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
163c0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
163d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
163e0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
163f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16400 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16410 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a  P_Cast, target,.
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
16440 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
16450 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29  r->u.zToken, 0))
16460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16470 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
16480 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
16490 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
164a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
164b0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
164c0 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
164d0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
164e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
164f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
16500 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
16510 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
16520 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
16530 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
16540 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
16550 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
16560 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72 31  K_EQ: {.      r1
16570 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16580 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16590 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
165a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
165b0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
165c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
165d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
165e0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
165f0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
16600 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16610 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
16620 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
16630 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
16640 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
16650 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61 73  OREP2);.      as
16660 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
16670 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
16680 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
16690 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
166a0 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
166b0 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
166c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
166d0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
166e0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
166f0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
16700 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
16710 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
16720 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
16730 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
16740 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
16750 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
16760 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
16770 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
16780 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
16790 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
167a0 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
167b0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
167c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
167d0 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
167e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
167f0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
16800 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
16810 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16820 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
16830 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16840 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16850 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16860 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
16870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16880 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
16890 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
168a0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
168b0 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
168c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
168d0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
168e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
168f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16900 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16910 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16920 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16930 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16940 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
16950 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
16960 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
16970 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
16980 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
16990 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
169a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
169b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
169c0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
169d0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
169e0 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
169f0 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55  REP2 | SQLITE_NU
16a00 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
16a10 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
16a20 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20  p==TK_EQ);.     
16a30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16a40 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20  v, op==TK_NE);. 
16a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16a60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
16a70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16a80 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16aa0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
16ab0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
16ac0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
16ad0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
16ae0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
16af0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
16b00 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
16b10 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
16b20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
16b30 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
16b40 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
16b50 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
16b60 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
16b70 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
16b80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16b90 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
16ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
16bb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
16bc0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
16bd0 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
16be0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
16bf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16c00 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
16c10 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
16c20 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
16c30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16c40 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
16c50 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
16c60 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
16c70 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
16c80 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
16c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16ca0 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
16cb0 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
16cc0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
16cd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16ce0 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
16cf0 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
16d00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
16d10 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
16d20 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
16d30 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
16d40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16d50 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
16d60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
16d70 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
16d80 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
16d90 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
16da0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16db0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
16dc0 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
16dd0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
16de0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
16df0 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
16e00 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
16e10 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
16e20 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
16e30 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16e40 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
16e50 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
16e60 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
16e70 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
16e80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16e90 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
16ea0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
16eb0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
16ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16ed0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16ee0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
16ef0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
16f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16f10 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
16f20 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
16f30 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16f40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
16f50 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
16f60 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
16f70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16f80 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
16f90 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
16fa0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
16fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16fc0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
16fd0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
16fe0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
16ff0 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
17000 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
17010 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65   target);.#ifnde
17020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
17030 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
17040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
17050 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
17060 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17070 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
17080 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
17090 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
170a0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
170b0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
170c0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e   1, target);.#en
170d0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
170e0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
170f0 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
17100 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
17110 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
17120 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
17130 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
17140 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
17150 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17160 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17170 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
17180 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
17190 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
171a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
171b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
171c0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
171d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
171e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
171f0 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
17200 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
17210 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17220 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
17230 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
17240 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
17250 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17260 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
17270 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
17280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17290 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
172a0 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
172b0 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
172c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
172d0 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
172e0 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
172f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
17300 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
17310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17320 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17330 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17340 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
17350 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
17360 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
17370 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
17380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17390 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
173a0 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
173b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
173c0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
173d0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
173e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
173f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17400 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
17410 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
17420 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
17430 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
17440 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
17450 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
17460 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
17470 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
17480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17490 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
174a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
174b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
174c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
174d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
174e0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
174f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17500 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17510 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17520 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
17530 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
17540 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
17550 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
17560 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
17570 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
17580 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
17590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
175a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
175b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
175c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
175d0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
175e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
175f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
17600 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
17610 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
17620 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
17630 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
17640 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
17650 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17660 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17670 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
17680 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17690 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
176a0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
176b0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
176c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
176d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
176e0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
176f0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
17700 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
17710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
17720 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17730 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
17740 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
17750 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
17760 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
17770 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
17780 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
17790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
177a0 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
177b0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
177c0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
177d0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
177e0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
177f0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
17800 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  */.      int nId
17810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17820 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
17830 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69   function name i
17840 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
17850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
17860 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
17870 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
17880 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
17890 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
178a0 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
178b0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
178c0 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
178d0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
178f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
17900 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
17910 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20  NC(db);      /* 
17920 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  The text encodin
17930 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64  g used by this d
17940 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
17950 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
17960 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c  = 0;    /* A col
17970 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
17980 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
17990 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
179a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
179b0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
179c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
179d0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
179e0 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
179f0 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
17a00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17a10 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
17a20 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
17a30 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
17a40 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
17a50 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
17a60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
17a70 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17a80 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
17a90 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
17aa0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
17ab0 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69        nId = sqli
17ac0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29  te3Strlen30(zId)
17ad0 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
17ae0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
17af0 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
17b00 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
17b10 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
17b20 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 75 6e  =0 || pDef->xFun
17b30 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
17b40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17b50 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
17b60 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28   function: %.*s(
17b70 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  )", nId, zId);. 
17b80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17b90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17ba0 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
17bb0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17bc0 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
17bd0 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
17be0 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
17bf0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
17c00 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
17c10 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
17c20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
17c30 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
17c40 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
17c50 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
17c60 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
17c70 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
17c80 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
17c90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
17ca0 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
17cb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17cc0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
17cd0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
17ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
17cf0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
17d00 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
17d10 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
17d20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
17d30 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
17d40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17d60 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
17d70 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
17d80 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
17d90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17db0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
17dc0 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  rse, target, 1);
17dd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17de0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17df0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
17e00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17e10 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
17e20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[i].pExpr, ta
17e30 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
17e40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17e50 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
17e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17e70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17e80 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
17e90 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
17ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17eb0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e  .      /* The UN
17ec0 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f  LIKELY() functio
17ed0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  n is a no-op.  T
17ee0 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
17ef0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
17f00 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
17f10 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
17f20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
17f30 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
17f40 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
17f50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17f60 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a  rt( nFarg>=1 );.
17f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17f80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17f90 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
17fa0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
17fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17fc0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
17fd0 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
17fe0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
17ff0 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
18000 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
18010 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
18020 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
18030 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
18040 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
18050 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28  sk |= MASKBIT32(
18060 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
18070 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
18080 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
18090 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
180a0 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
180b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
180c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
180d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
180e0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
180f0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
18100 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18110 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
18120 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
18130 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
18140 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
18150 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
18160 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
18170 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
18180 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
18190 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
181a0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
181b0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
181c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
181d0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
181e0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
181f0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
18200 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
18210 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
18220 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
18230 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
18240 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
18250 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
18260 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
18270 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
18280 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
18290 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
182a0 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
182b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
182c0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
182d0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
182e0 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
182f0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
18300 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
18310 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
18320 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
18330 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
18340 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
18350 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
18360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
18370 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
18380 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
18390 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
183a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
183b0 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
183c0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
183d0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
183e0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
183f0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
18400 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
18410 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
18420 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
18430 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
18440 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
18450 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
18460 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
18470 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
18480 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
18490 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
184a0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
184b0 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
184c0 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
184d0 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
184e0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
184f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18500 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
18510 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
18520 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
18530 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
18540 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
18550 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
18560 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
18570 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20 20 20  Farg, r1,.      
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
185a0 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45  _ECEL_DUP|SQLITE
185b0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20  _ECEL_FACTOR);. 
185c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
185d0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
185e0 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  e);      /* Tick
185f0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
18600 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
18610 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
18620 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
18630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
18640 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
18650 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
18660 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
18670 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
18680 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
18690 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
186a0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
186b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
186c0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
186d0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
186e0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
186f0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
18700 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
18710 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
18720 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
18730 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
18740 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
18750 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
18760 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
18770 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
18780 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
18790 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
187a0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
187b0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
187c0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
187d0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
187e0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
187f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
18800 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
18810 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
18820 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
18830 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
18840 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
18850 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
18860 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
18870 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
18880 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
18890 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
188a0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
188b0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
188c0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
188d0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
188e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
188f0 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
18900 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
18910 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
18920 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
18930 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
18940 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
18950 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
18960 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
18970 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
18980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
18990 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
189a0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
189b0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
189c0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
189d0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
189e0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
189f0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
18a00 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
18a10 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
18a20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
18a30 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
18a40 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
18a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18a60 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
18a70 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
18a80 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
18a90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18ab0 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
18ac0 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
18ad0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
18b00 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
18b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18b20 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
18b30 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
18b40 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
18b50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
18b60 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18b70 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
18b80 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
18b90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
18ba0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
18bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18bc0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
18bd0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
18be0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
18bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18c00 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
18c10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18c20 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18c30 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
18c40 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
18c50 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
18c60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
18c70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18c80 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
18c90 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
18ca0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
18cb0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18cc0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
18cd0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
18ce0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18cf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
18d10 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
18d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18d30 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
18d40 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
18d50 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
18d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18d70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18d80 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
18d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18da0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18db0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
18dc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18dd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18de0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
18df0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
18e00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18e10 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
18e20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18e30 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
18e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18e50 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
18e60 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
18e70 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
18e80 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
18e90 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
18ea0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
18eb0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
18ec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
18ed0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
18ee0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
18ef0 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
18f00 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
18f10 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
18f20 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
18f30 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
18f40 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
18f50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
18f60 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
18f70 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
18f80 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
18f90 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18fa0 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
18fb0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
18fc0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
18fd0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
18fe0 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20  Expr;..      r1 
18ff0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19000 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
19010 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
19020 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
19030 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
19040 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
19050 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
19060 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19070 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19080 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
19090 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
190a0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
190b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
190c0 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
190d0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
190e0 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
190f0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
19100 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
19110 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
19120 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
19130 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
19140 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  P2);  VdbeCovera
19150 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49  ge(v);.      pLI
19160 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
19170 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
19180 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
19190 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
191a0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
191b0 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
191c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
191d0 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
191e0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
191f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
19200 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
19210 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
19220 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
19230 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
19240 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
19250 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
19260 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19280 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19290 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72  And, r3, r4, tar
192a0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
192b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
192c0 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
192d0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
192e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
192f0 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72  e, r4);.      br
19300 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19310 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
19320 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
19330 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
19340 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
19350 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
19360 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
19370 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
19380 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
19390 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
193a0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
193b0 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
193c0 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
193d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
193e0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
193f0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
19400 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
19410 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
19420 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
19430 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
19440 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
19450 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
19460 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
19470 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
19480 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
19490 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
194a0 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
194b0 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
194c0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
194d0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
194e0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
194f0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
19500 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
19510 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
19520 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
19530 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
19540 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19550 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
19560 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
19570 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
19580 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
19590 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
195a0 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
195b0 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
195c0 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
195d0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
195e0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
195f0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
19600 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
19610 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
19620 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
19630 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
19640 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
19650 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
19660 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
19670 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
19680 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
19690 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
196a0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
196b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
196c0 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
196d0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
196e0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
196f0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
19700 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
19710 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
19720 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
19730 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
19740 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
19750 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
19760 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
19770 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
19780 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
19790 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
197a0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
197b0 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
197c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
197d0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
197e0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
197f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
19800 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
19810 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
19820 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
19830 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
19840 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
19850 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
19860 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
19870 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
19880 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
19890 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
198a0 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
198b0 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
198c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
198d0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
198e0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
198f0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
19900 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
19910 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
19920 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
19930 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
19940 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
19950 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
19960 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
19970 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
19980 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
19990 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
199a0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
199b0 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
199c0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
199d0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
199e0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
199f0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
19a00 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
19a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19a20 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
19a30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
19a40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19a50 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
19a60 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
19a70 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
19a80 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
19a90 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
19aa0 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
19ab0 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
19ac0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
19ad0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
19ae0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
19af0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19b00 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
19b10 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
19b20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
19b30 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
19b40 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
19b50 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
19b60 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
19b70 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
19b80 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
19b90 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
19ba0 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  real..      **. 
19bb0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
19bc0 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36  -OF: R-60985-576
19bd0 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63  62 SQLite will c
19be0 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65  onvert the value
19bf0 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a   back to.      *
19c00 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
19c10 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
19c20 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63   it from the rec
19c30 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ord.  */.      i
19c40 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
19c50 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
19c60 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
19c70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
19c80 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
19c90 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
19ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19cb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
19cc0 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
19cd0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
19ce0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
19cf0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
19d00 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
19d10 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
19d20 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
19d30 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
19d40 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
19d50 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
19d60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
19d70 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
19d80 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
19d90 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
19da0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
19db0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
19dc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
19dd0 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
19de0 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
19df0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
19e00 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
19e10 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
19e20 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
19e30 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
19e40 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
19e50 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
19e60 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
19e70 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
19e80 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
19e90 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
19ea0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
19eb0 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
19ec0 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
19ed0 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
19ee0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
19ef0 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
19f00 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
19f10 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
19f20 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
19f30 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
19f40 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
19f50 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
19f60 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
19f70 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
19f80 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
19f90 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
19fa0 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
19fb0 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
19fc0 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
19fd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
19fe0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
19ff0 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
1a000 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
1a010 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
1a020 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
1a030 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
1a040 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
1a050 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
1a060 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
1a070 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
1a080 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
1a090 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
1a0a0 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
1a0b0 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
1a0e0 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
1a0f0 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
1a100 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
1a130 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
1a140 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
1a150 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a170 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
1a180 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
1a190 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1a1c0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
1a1d0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
1a200 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
1a210 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1a220 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
1a230 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
1a240 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1a250 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
1a280 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a290 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
1a2c0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1a2d0 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
1a2e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a2f0 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
1a300 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
1a310 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
1a320 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
1a330 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
1a340 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1a350 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
1a360 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1a370 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1a380 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
1a390 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
1a3a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
1a3b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
1a3c0 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
1a3d0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1a3e0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1a3f0 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
1a400 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
1a410 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
1a420 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
1a430 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
1a440 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1a450 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
1a460 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
1a470 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
1a480 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
1a490 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
1a4a0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1a4b0 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
1a4c0 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69  ter(&tempX, sqli
1a4d0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1a4e0 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
1a4f0 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
1a500 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1a510 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1a520 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
1a530 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
1a540 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
1a550 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20  = &tempX;.      
1a560 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
1a570 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
1a580 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
1a590 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
1a5a0 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
1a5b0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
1a5c0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
1a5d0 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
1a5e0 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
1a5f0 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
1a600 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
1a610 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
1a620 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
1a630 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
1a640 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
1a650 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
1a660 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
1a670 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
1a680 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1a690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1a6a0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
1a6b0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
1a6c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a6d0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1a6e0 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
1a6f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1a700 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
1a710 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
1a720 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
1a730 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
1a740 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a750 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
1a760 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
1a770 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
1a780 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
1a790 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a7a0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1a7b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1a7c0 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
1a7d0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
1a7e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1a7f0 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
1a800 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
1a810 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1a820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a830 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
1a840 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1a850 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1a860 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1a870 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
1a880 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
1a890 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
1a8a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a8b0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e  , OP_Goto, 0, en
1a8c0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
1a8d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a8e0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1a8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a900 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a910 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
1a920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e    }.      if( (n
1a930 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20  Expr&1)!=0 ){.  
1a940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a950 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1a960 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
1a970 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1a980 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45  se, pEList->a[nE
1a990 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61  xpr-1].pExpr, ta
1a9a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
1a9b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1a9c0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1a9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a9e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a9f0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1aa00 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1aa10 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1aa20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1aa30 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
1aa40 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
1aa50 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
1aa60 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
1aa70 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
1aa80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1aa90 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
1aaa0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1aab0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1aac0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
1aad0 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
1aae0 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
1aaf0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
1ab00 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
1ab10 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
1ab20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1ab30 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
1ab40 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
1ab50 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
1ab60 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
1ab70 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1ab80 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
1ab90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
1aba0 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
1abb0 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
1abc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1abd0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
1abf0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
1ac00 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
1ac10 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
1ac20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ac30 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1ac40 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
1ac50 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
1ac60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ac70 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
1ac80 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
1ac90 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1aca0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1acb0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1acc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
1acd0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1ace0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
1acf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ad00 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
1ad10 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
1ad20 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
1ad30 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
1ad40 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
1ad50 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1ad60 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
1ad70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad80 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
1ad90 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
1ada0 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
1adb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
1ade0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1adf0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
1ae00 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
1ae10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1ae20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1ae30 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1ae40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1ae50 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1ae60 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1ae70 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
1ae80 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
1ae90 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
1aea0 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
1aeb0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
1aec0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
1aed0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1aee0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1aef0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1af00 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1af10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1af20 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1af30 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1af40 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
1af50 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
1af60 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
1af70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74  Dest,      /* St
1af80 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
1af90 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1afa0 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20  /.  u8 reusable 
1afb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1afc0 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1afd0 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a   is reusable */.
1afe0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
1aff0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
1b000 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1b010 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
1b020 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
1b030 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1b040 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
1b050 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
1b060 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
1b070 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1b080 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
1b090 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
1b0a0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1b0b0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1b0c0 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
1b0d0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
1b0e0 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
1b0f0 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d  Dest;.     pItem
1b100 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75  ->reusable = reu
1b110 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61  sable;.  }.  pPa
1b120 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
1b130 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = p;.}../*.** Ge
1b140 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1b150 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1b160 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
1b170 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
1b180 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
1b190 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
1b1a0 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
1b1b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1b1c0 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1b1d0 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
1b1e0 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1b1f0 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
1b200 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
1b210 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
1b220 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
1b230 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
1b240 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1b250 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
1b260 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
1b270 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
1b280 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
1b290 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
1b2a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1b2b0 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
1b2c0 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
1b2d0 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
1b2e0 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
1b2f0 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
1b300 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
1b310 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
1b320 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
1b330 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
1b340 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
1b350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b360 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
1b370 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b380 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
1b390 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
1b3a0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1b3b0 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
1b3c0 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
1b3d0 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
1b3e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
1b3f0 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
1b400 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1b410 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
1b420 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ).  ){.    ExprL
1b430 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ist *p = pParse-
1b440 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
1b450 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65   int i;.    *pRe
1b460 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g  = 0;.    if( 
1b470 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  p ){.      struc
1b480 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1b490 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
1b4a0 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
1b4b0 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
1b4c0 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
1b4d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1b4e0 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
1b4f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1b500 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
1b510 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
1b520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
1b530 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
1b540 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rReg;.        }.
1b550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b560 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d    r2 = ++pParse-
1b570 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1b580 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1b590 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1b5a0 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r2, 1);.  }else{
1b5b0 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
1b5c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1b5d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
1b5e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1b5f0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1b600 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
1b610 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
1b620 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
1b630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b640 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1b650 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1b660 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
1b670 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1b680 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
1b690 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1b6a0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1b6b0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
1b6c0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
1b6d0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1b6e0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1b6f0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
1b700 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1b710 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
1b720 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1b730 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b740 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
1b750 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1b760 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1b770 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
1b780 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1b790 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1b7a0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1b7b0 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
1b7c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
1b7d0 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
1b7e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1b7f0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
1b800 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
1b810 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
1b820 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
1b830 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1b840 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1b850 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1b860 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1b870 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61  se->pVdbe || pPa
1b880 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1b890 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
1b8a0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
1b8b0 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
1b8c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b8d0 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1b8e0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1b8f0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
1b900 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
1b910 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b920 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1b930 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1b940 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1b950 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1b960 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
1b970 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1b980 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
1b990 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
1b9a0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1b9b0 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
1b9c0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
1b9d0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1b9e0 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
1b9f0 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
1ba00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
1ba10 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1ba20 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1ba30 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1ba40 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
1ba50 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1ba60 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1ba70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
1ba80 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
1ba90 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1baa0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
1bab0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1bac0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1bad0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
1bae0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1baf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1bb00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1bb10 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
1bb20 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1bb30 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
1bb40 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
1bb50 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
1bb60 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
1bb70 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1bb80 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
1bb90 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1bba0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
1bbb0 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
1bbc0 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
1bbd0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
1bbe0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1bbf0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
1bc00 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
1bc10 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
1bc20 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
1bc30 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
1bc40 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1bc50 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1bc60 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
1bc70 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
1bc80 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
1bc90 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
1bca0 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
1bcb0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
1bcc0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
1bcd0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
1bce0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1bcf0 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1bd00 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1bd10 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1bd20 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1bd30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1bd40 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
1bd50 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1bd60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1bd70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1bd80 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
1bd90 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1bda0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1bdb0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
1bdc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1bdd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bde0 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
1bdf0 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
1be00 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
1be10 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  iMem);.}..#ifdef
1be20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1be30 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1be40 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1be50 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1be60 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
1be70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1be80 54 72 65 65 56 69 65 77 45 78 70 72 28 54 72 65  TreeViewExpr(Tre
1be90 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f  eView *pView, co
1bea0 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c  nst Expr *pExpr,
1beb0 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77   u8 moreToFollow
1bec0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1bed0 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f  *zBinOp = 0;   /
1bee0 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  * Binary operato
1bef0 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
1bf00 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20  r *zUniOp = 0;  
1bf10 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74   /* Unary operat
1bf20 6f 72 20 2a 2f 0a 20 20 70 56 69 65 77 20 3d 20  or */.  pView = 
1bf30 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
1bf40 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54  ush(pView, moreT
1bf50 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20  oFollow);.  if( 
1bf60 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1bf70 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1bf80 69 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 22  ine(pView, "nil"
1bf90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
1bfa0 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
1bfb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1bfc0 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  }.  switch( pExp
1bfd0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
1bfe0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1bff0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c000 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1c010 65 77 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22  ew, "AGG{%d:%d}"
1c020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ,.            pE
1c030 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
1c040 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1c050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c060 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1c070 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1c080 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
1c090 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1c0a0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
1c0b0 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
1c0c0 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
1c0d0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1c0e0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c0f0 69 65 77 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29  iew, "COLUMN(%d)
1c100 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ", pExpr->iColum
1c110 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1c120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c130 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1c140 65 77 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20  ew, "{%d:%d}",. 
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1c170 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
1c180 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1c190 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c1a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c1b0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
1c1c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
1c1d0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
1c1e0 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
1c1f0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1c200 65 28 70 56 69 65 77 2c 20 22 25 64 22 2c 20 70  e(pView, "%d", p
1c210 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
1c220 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c230 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1c240 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1c250 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%s", pExpr->u.
1c260 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1c270 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c280 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1c290 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1c2a0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1c2b0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1c2c0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1c2d0 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 73 22  wLine(pView,"%s"
1c2e0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c2f0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1c300 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1c310 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1c320 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c330 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c340 69 65 77 2c 22 25 51 22 2c 20 70 45 78 70 72 2d  iew,"%Q", pExpr-
1c350 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1c360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c370 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1c380 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c390 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1c3a0 65 77 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ew,"NULL");.    
1c3b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1c3c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c3d0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
1c3e0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
1c3f0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c400 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c410 69 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  iew,"%s", pExpr-
1c420 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1c430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1c440 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1c450 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1c460 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1c470 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 56  iewLine(pView,"V
1c480 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c  ARIABLE(%s,%d)",
1c490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c4a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1c4b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70  ->u.zToken, pExp
1c4c0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1c4d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c4e0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1c4f0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
1c500 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1c510 65 28 70 56 69 65 77 2c 22 52 45 47 49 53 54 45  e(pView,"REGISTE
1c520 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69  R(%d)", pExpr->i
1c530 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1c540 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c550 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
1c560 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1c570 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 41 53  ewLine(pView,"AS
1c580 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a   %Q", pExpr->u.z
1c590 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71  Token);.      sq
1c5a0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1c5b0 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  r(pView, pExpr->
1c5c0 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
1c5d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c5e0 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a    case TK_ID: {.
1c5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1c600 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1c610 22 49 44 20 25 51 22 2c 20 70 45 78 70 72 2d 3e  "ID %Q", pExpr->
1c620 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1c630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1c640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c650 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1c660 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1c670 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1c680 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1c690 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1c6a0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  en) */.      sql
1c6b0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1c6c0 28 70 56 69 65 77 2c 22 43 41 53 54 20 25 51 22  (pView,"CAST %Q"
1c6d0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1c6e0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1c6f0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
1c700 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  iew, pExpr->pLef
1c710 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  t, 0);.      bre
1c720 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1c730 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c740 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
1c750 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69   TK_LT:      zBi
1c760 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  nOp = "LT";     
1c770 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c780 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_LE:      zBin
1c790 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62  Op = "LE";     b
1c7a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c7b0 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GT:      zBinO
1c7c0 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72  p = "GT";     br
1c7d0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c7e0 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _GE:      zBinOp
1c7f0 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72 65   = "GE";     bre
1c800 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c810 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  NE:      zBinOp 
1c820 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61  = "NE";     brea
1c830 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
1c840 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  Q:      zBinOp =
1c850 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b   "EQ";     break
1c860 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1c870 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1c880 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "IS";     break;
1c890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1c8a0 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  OT:   zBinOp = "
1c8b0 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ISNOT";  break;.
1c8c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1c8d0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41       zBinOp = "A
1c8e0 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ND";    break;. 
1c8f0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
1c900 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52      zBinOp = "OR
1c910 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1c920 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
1c930 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44     zBinOp = "ADD
1c940 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1c950 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20   case TK_STAR:  
1c960 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22    zBinOp = "MUL"
1c970 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1c980 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
1c990 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b   zBinOp = "SUB";
1c9a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c9b0 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
1c9c0 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20  zBinOp = "REM"; 
1c9d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c9e0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a  se TK_BITAND:  z
1c9f0 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22  BinOp = "BITAND"
1ca00 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1ca10 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42  e TK_BITOR:   zB
1ca20 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20  inOp = "BITOR"; 
1ca30 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1ca40 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69   TK_SLASH:   zBi
1ca50 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  nOp = "DIV";    
1ca60 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1ca70 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_LSHIFT:  zBin
1ca80 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62  Op = "LSHIFT"; b
1ca90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1caa0 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_RSHIFT:  zBinO
1cab0 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72  p = "RSHIFT"; br
1cac0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1cad0 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70  _CONCAT:  zBinOp
1cae0 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65   = "CONCAT"; bre
1caf0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1cb00 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20  DOT:     zBinOp 
1cb10 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72 65 61  = "DOT";    brea
1cb20 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
1cb30 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20  UMINUS:  zUniOp 
1cb40 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61  = "UMINUS"; brea
1cb50 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
1cb60 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d  PLUS:   zUniOp =
1cb70 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b   "UPLUS";  break
1cb80 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1cb90 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  TNOT:  zUniOp = 
1cba0 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b  "BITNOT"; break;
1cbb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1cbc0 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  :     zUniOp = "
1cbd0 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NOT";    break;.
1cbe0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1cbf0 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49  LL:  zUniOp = "I
1cc00 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20  SNULL"; break;. 
1cc10 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1cc20 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f  LL: zUniOp = "NO
1cc30 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
1cc40 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
1cc50 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ATE: {.      sql
1cc60 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1cc70 28 70 56 69 65 77 2c 20 22 43 4f 4c 4c 41 54 45  (pView, "COLLATE
1cc80 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a   %Q", pExpr->u.z
1cc90 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71  Token);.      sq
1cca0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1ccb0 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  r(pView, pExpr->
1ccc0 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
1ccd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1cce0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1ccf0 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
1cd00 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
1cd10 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
1cd20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
1cd30 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
1cd40 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
1cd50 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1cd60 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1cd70 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1cd80 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1cd90 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1cda0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1cdb0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1cdc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cdd0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1cde0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  _AGG_FUNCTION ){
1cdf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ce00 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1ce10 65 77 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f  ew, "AGG_FUNCTIO
1ce20 4e 25 64 20 25 51 22 2c 0a 20 20 20 20 20 20 20  N%d %Q",.       
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
1ce50 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ce60 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1ce70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ce80 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1ce90 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e 20 25 51  ew, "FUNCTION %Q
1cea0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1ceb0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
1cec0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
1ced0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
1cee0 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
1cef0 70 56 69 65 77 2c 20 70 46 61 72 67 2c 20 30 2c  pView, pFarg, 0,
1cf00 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1cf10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cf20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cf30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1cf40 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
1cf50 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1cf60 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1cf70 65 77 2c 20 22 45 58 49 53 54 53 2d 65 78 70 72  ew, "EXISTS-expr
1cf80 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1cf90 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
1cfa0 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e  pView, pExpr->x.
1cfb0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
1cfc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cfd0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1cfe0 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
1cff0 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1d000 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54 2d 65  pView, "SELECT-e
1d010 78 70 72 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr");.      sql
1d020 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
1d030 63 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  ct(pView, pExpr-
1d040 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  >x.pSelect, 0);.
1d050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d060 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1d070 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
1d080 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d090 56 69 65 77 2c 20 22 49 4e 22 29 3b 0a 20 20 20  View, "IN");.   
1d0a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d0b0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
1d0c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b 0a  xpr->pLeft, 1);.
1d0d0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1d0e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d0f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1d100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d110 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
1d120 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e  pView, pExpr->x.
1d130 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
1d140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d150 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d160 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
1d170 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1d180 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
1d190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d1a0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1d1b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d1c0 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  Y */..    /*.   
1d1d0 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
1d1e0 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
1d1f0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
1d200 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
1d210 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
1d220 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
1d230 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
1d240 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1d250 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
1d260 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1d270 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
1d280 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
1d290 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1d2a0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
1d2b0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
1d2c0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
1d2d0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
1d2e0 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  *pX = pExpr->pLe
1d2f0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
1d300 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pY = pExpr->x.pL
1d310 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1d320 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20  .      Expr *pZ 
1d330 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d340 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1d350 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d360 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
1d370 42 45 54 57 45 45 4e 22 29 3b 0a 20 20 20 20 20  BETWEEN");.     
1d380 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d390 45 78 70 72 28 70 56 69 65 77 2c 20 70 58 2c 20  Expr(pView, pX, 
1d3a0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1d3b0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
1d3c0 69 65 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20 20  iew, pY, 1);.   
1d3d0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d3e0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 5a  ewExpr(pView, pZ
1d3f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
1d400 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d410 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a  e TK_TRIGGER: {.
1d420 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d430 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49  opcode is TK_TRI
1d440 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65  GGER, then the e
1d450 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72  xpression is a r
1d460 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  eference.      *
1d470 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  * to a column in
1d480 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c   the new.* or ol
1d490 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
1d4a0 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20  s available to. 
1d4b0 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
1d4c0 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69  programs. In thi
1d4d0 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62  s case Expr.iTab
1d4e0 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66  le is set to 1 f
1d4f0 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  or the.      ** 
1d500 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
1d510 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65  le, or 0 for the
1d520 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1d530 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d  ble. Expr.iColum
1d540 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  n.      ** is se
1d550 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
1d560 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61  of the pseudo-ta
1d570 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20  ble to read, or 
1d580 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a  to -1 to.      *
1d590 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64  * read the rowid
1d5a0 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f   field..      */
1d5b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1d5c0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1d5d0 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20  , "%s(%d)", .   
1d5e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
1d5f0 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22  able ? "NEW" : "
1d600 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f  OLD", pExpr->iCo
1d610 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  lumn);.      bre
1d620 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d630 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20  se TK_CASE: {.  
1d640 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d650 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
1d660 43 41 53 45 22 29 3b 0a 20 20 20 20 20 20 73 71  CASE");.      sq
1d670 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1d680 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  r(pView, pExpr->
1d690 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20 20  pLeft, 1);.     
1d6a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d6b0 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
1d6c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1d6d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
1d6e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1d6f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1d700 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
1d710 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
1d720 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1d730 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20  pe = "unk";.    
1d740 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1d750 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  >affinity ){.   
1d760 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
1d770 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d  lback:   zType =
1d780 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72   "rollback";  br
1d790 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1d7a0 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20  e OE_Abort:     
1d7b0 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22   zType = "abort"
1d7c0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1d7d0 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
1d7e0 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  l:       zType =
1d7f0 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72   "fail";      br
1d800 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1d810 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20  e OE_Ignore:    
1d820 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65   zType = "ignore
1d830 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1d840 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d850 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d860 56 69 65 77 2c 20 22 52 41 49 53 45 20 25 73 28  View, "RAISE %s(
1d870 25 51 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78  %Q)", zType, pEx
1d880 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1d890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d8a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
1d8b0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
1d8c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d8d0 65 28 70 56 69 65 77 2c 20 22 6f 70 3d 25 64 22  e(pView, "op=%d"
1d8e0 2c 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20  , pExpr->op);.  
1d8f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d900 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f  .  }.  if( zBinO
1d910 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
1d920 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1d930 65 77 2c 20 22 25 73 22 2c 20 7a 42 69 6e 4f 70  ew, "%s", zBinOp
1d940 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
1d950 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
1d960 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1d970 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  1);.    sqlite3T
1d980 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1d990 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  w, pExpr->pRight
1d9a0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
1d9b0 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20  ( zUniOp ){.    
1d9c0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1d9d0 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c  ine(pView, "%s",
1d9e0 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71   zUniOp);.    sq
1d9f0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1da00 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  r(pView, pExpr->
1da10 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pLeft, 0);.  }. 
1da20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1da30 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65  Pop(pView);.}.#e
1da40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
1da50 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
1da60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1da70 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
1da80 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70  man-readable exp
1da90 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65  lanation of an e
1daa0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
1dab0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
1dac0 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
1dad0 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70 56 69  .  TreeView *pVi
1dae0 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70 72  ew,.  const Expr
1daf0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20 75  List *pList,.  u
1db00 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c 0a  8 moreToFollow,.
1db10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
1db20 61 62 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  abel.){.  int i;
1db30 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74  .  pView = sqlit
1db40 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70  e3TreeViewPush(p
1db50 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c  View, moreToFoll
1db60 6f 77 29 3b 0a 20 20 69 66 28 20 7a 4c 61 62 65  ow);.  if( zLabe
1db70 6c 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b 30  l==0 || zLabel[0
1db80 5d 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20 3d 20  ]==0 ) zLabel = 
1db90 22 4c 49 53 54 22 3b 0a 20 20 69 66 28 20 70 4c  "LIST";.  if( pL
1dba0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ist==0 ){.    sq
1dbb0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1dbc0 65 28 70 56 69 65 77 2c 20 22 25 73 20 28 65 6d  e(pView, "%s (em
1dbd0 70 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a  pty)", zLabel);.
1dbe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1dbf0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1dc00 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 7a 4c  (pView, "%s", zL
1dc10 61 62 65 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  abel);.    for(i
1dc20 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1dc30 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1dc40 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1dc50 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69 73 74  xpr(pView, pList
1dc60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 3c  ->a[i].pExpr, i<
1dc70 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
1dc80 0a 23 69 66 20 30 0a 20 20 20 20 20 69 66 28 20  .#if 0.     if( 
1dc90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1dca0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1dcb0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1dcc0 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25 73 22  f(pOut, " AS %s"
1dcd0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
1dce0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1dcf0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1dd00 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62 20 29  [i].bSpanIsTab )
1dd10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1dd20 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1dd30 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20 70 4c  Out, " (%s)", pL
1dd40 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
1dd50 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1dd60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1dd70 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
1dd80 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66  pView);.}.#endif
1dd90 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1dda0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
1ddb0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
1ddc0 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
1ddd0 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
1dde0 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
1ddf0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1de00 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
1de10 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
1de20 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
1de30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1de40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1de50 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
1de60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1de70 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20  E_ECEL_DUP flag 
1de80 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67  prevents the arg
1de90 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e  uments from bein
1dea0 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e  g.** filled usin
1deb0 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f  g OP_SCopy.  OP_
1dec0 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65  Copy must be use
1ded0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
1dee0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
1def0 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74  _FACTOR argument
1df00 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74   allows constant
1df10 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65   arguments to be
1df20 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74  .** factored out
1df30 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61   into initializa
1df40 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  tion code..*/.in
1df50 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1df60 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
1df70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1df80 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1df90 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
1dfa0 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68   *pList,   /* Th
1dfb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
1dfc0 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
1dfd0 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20  .  int target,  
1dfe0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
1dff0 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20  o write results 
1e000 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
1e010 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
1e020 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
1e030 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
1e040 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1e050 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  em;.  int i, n;.
1e060 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66    u8 copyOp = (f
1e070 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
1e080 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70  EL_DUP) ? OP_Cop
1e090 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  y : OP_SCopy;.  
1e0a0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
1e0b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
1e0c0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
1e0d0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
1e0e0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65  e!=0 );  /* Neve
1e0f0 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20  r gets this far 
1e100 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e  otherwise */.  n
1e110 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1e120 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63  .  if( !ConstFac
1e130 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20  torOk(pParse) ) 
1e140 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
1e150 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20  _ECEL_FACTOR;.  
1e160 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
1e170 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
1e180 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1e190 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1e1a0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
1e1b0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51   if( (flags & SQ
1e1c0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
1e1d0 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45  )!=0 && sqlite3E
1e1e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
1e1f0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
1e200 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
1e210 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
1e220 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b  r, target+i, 0);
1e230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e240 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71    int inReg = sq
1e250 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1e260 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1e270 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
1e280 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1e290 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
1e2a0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
1e2b0 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20          Vdbe *v 
1e2c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e2d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70  .        if( cop
1e2e0 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  yOp==OP_Copy.   
1e2f0 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71        && (pOp=sq
1e300 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
1e310 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  , -1))->opcode==
1e320 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
1e330 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
1e340 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20  >p3+1==inReg.   
1e350 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32        && pOp->p2
1e360 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67  +pOp->p3+1==targ
1e370 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a  et+i.        ){.
1e380 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
1e390 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  3++;.        }el
1e3a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
1e3b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e3c0 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67  v, copyOp, inReg
1e3d0 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
1e3e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e3f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e400 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
1e410 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1e420 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  a BETWEEN operat
1e430 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42  or..**.**    x B
1e440 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a  ETWEEN y AND z.*
1e450 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
1e460 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1e470 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41  .**.**    x>=y A
1e480 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f  ND x<=z.**.** Co
1e490 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
1e4a0 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
1e4b0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
1e4c0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69  xpression.** eli
1e4d0 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a  mination of x..*
1e4e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1e4f0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20  prCodeBetween(. 
1e500 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1e510 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1e520 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1e530 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1e540 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1e550 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20   /* The BETWEEN 
1e560 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1e570 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
1e580 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1e590 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  f the jump is ta
1e5a0 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  ken */.  int jum
1e5b0 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61  pIfTrue,   /* Ta
1e5c0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1e5d0 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72  he BETWEEN is tr
1e5e0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  ue */.  int jump
1e5f0 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
1e600 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1e610 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
1e620 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65  L */.){.  Expr e
1e630 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
1e640 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
1e650 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
1e660 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
1e670 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
1e680 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
1e690 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
1e6a0 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
1e6b0 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
1e6c0 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
1e6d0 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
1e6e0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1e6f0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
1e700 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
1e710 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  egister */..  as
1e720 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1e730 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1e740 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1e750 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
1e760 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
1e770 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
1e780 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
1e790 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
1e7a0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
1e7b0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
1e7c0 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
1e7d0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
1e7e0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1e7f0 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
1e800 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1e810 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
1e820 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
1e830 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
1e840 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
1e850 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
1e860 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1e870 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
1e880 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74  ;.  exprToRegist
1e890 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74  er(&exprX, sqlit
1e8a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e8b0 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26  Parse, &exprX, &
1e8c0 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66  regFree1));.  if
1e8d0 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a  ( jumpIfTrue ){.
1e8e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e8f0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
1e900 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1e910 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c  mpIfNull);.  }el
1e920 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1e930 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1e940 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1e950 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e960 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1e970 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1e980 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a  se, regFree1);..
1e990 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71    /* Ensure adeq
1e9a0 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61  uate test covera
1e9b0 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  ge */.  testcase
1e9c0 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1e9d0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1e9e0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1e9f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1ea00 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1ea10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1ea20 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1ea30 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1ea40 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1ea50 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1ea60 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1ea70 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1ea80 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1ea90 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1eaa0 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1eab0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1eac0 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1ead0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1eae0 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1eaf0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1eb00 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1eb10 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1eb20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1eb30 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1eb40 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1eb50 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1eb60 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1eb70 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1eb80 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1eb90 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a  egFree1!=0 );.}.
1eba0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1ebb0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1ebc0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1ebd0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1ebe0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1ebf0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1ec00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ec10 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
1ec20 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1ec30 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1ec40 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1ec50 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
1ec60 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1ec70 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1ec80 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1ec90 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
1eca0 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
1ecb0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
1ecc0 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
1ecd0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1ece0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
1ecf0 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1ed00 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
1ed10 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
1ed20 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
1ed30 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
1ed40 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
1ed50 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
1ed60 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
1ed70 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
1ed80 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
1ed90 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
1eda0 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
1edb0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
1edc0 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
1edd0 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
1ede0 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
1edf0 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
1ee00 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
1ee10 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
1ee20 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
1ee30 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
1ee40 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
1ee50 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1ee60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1ee70 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1ee80 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
1ee90 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
1eea0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1eeb0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
1eec0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1eed0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1eee0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
1eef0 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
1ef00 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1ef10 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
1ef20 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
1ef30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
1ef40 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72  ==0) )     retur
1ef50 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65  n;  /* Existence
1ef60 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64   of VDBE checked
1ef70 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20   by caller */.  
1ef80 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
1ef90 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
1efa0 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61  * No way this ca
1efb0 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70  n happen */.  op
1efc0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
1efd0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1efe0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1eff0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1f000 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1f010 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1f020 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f030 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f040 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f050 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1f060 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
1f070 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1f080 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1f090 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f0a0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1f0b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f0c0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1f0d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1f0e0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f0f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f100 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f110 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1f120 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1f130 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f140 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f150 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1f160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1f170 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1f180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f190 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1f1a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1f1b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f1d0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1f1e0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1f1f0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1f200 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f210 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1f220 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f230 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1f240 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f250 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f260 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1f270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f280 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f2a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f2b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f2c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f2d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f2e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f2f0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1f300 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1f310 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1f320 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1f330 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1f340 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_EQ: {.      te
1f350 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1f360 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
1f370 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1f380 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f390 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1f3a0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1f3b0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1f3c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f3d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f3e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1f3f0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1f400 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f410 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
1f420 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
1f430 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1f440 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f450 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
1f460 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
1f470 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f480 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
1f490 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
1f4a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1f4b0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
1f4c0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
1f4d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f4e0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
1f4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f500 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
1f510 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
1f520 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f530 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
1f540 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1f550 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1f560 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1f570 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f580 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1f590 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
1f5a0 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
1f5b0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62  (op==OP_Eq); Vdb
1f5c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f5d0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
1f5e0 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50  assert(TK_NE==OP
1f5f0 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ne); testcase(o
1f600 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43  p==OP_Ne); VdbeC
1f610 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f620 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65  OP_Ne);.      te
1f630 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f640 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f650 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f660 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f670 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f680 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
1f690 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20  e TK_ISNOT: {.  
1f6a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f6b0 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
1f6c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1f6d0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1f6e0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f6f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f700 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f710 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f720 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f730 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f740 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f750 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f760 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
1f770 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
1f780 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65  K_NE;.      code
1f790 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1f7a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
1f7b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
1f7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7d0 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
1f7e0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
1f7f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f800 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1f810 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
1f820 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1f830 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74  =TK_NE);.      t
1f840 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f850 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1f860 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1f870 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1f880 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f890 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1f8a0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1f8b0 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
1f8c0 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
1f8d0 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
1f8e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1f8f0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
1f900 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1f910 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
1f920 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f930 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1f940 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f950 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f960 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f970 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f990 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1f9a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62  dest);.      Vdb
1f9b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1f9c0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
1f9d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f9e0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
1f9f0 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
1fa00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1fa10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fa20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fa30 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
1fa40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fa50 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1fa60 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
1fa70 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
1fa80 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20  pExpr, dest, 1, 
1fa90 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1faa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fac0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1fad0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1fae0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
1faf0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
1fb00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1fb10 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1fb20 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c  Null = jumpIfNul
1fb30 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49  l ? dest : destI
1fb40 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71  fFalse;.      sq
1fb50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1fb60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1fb70 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74  estIfFalse, dest
1fb80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1fb90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1fba0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1fbb0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
1fbc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1fbd0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
1fbe0 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
1fbf0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1fc00 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1fc10 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
1fc20 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
1fc30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fc40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fc50 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1fc60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1fc70 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
1fc80 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
1fc90 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a      /* No-op */.
1fca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fcb0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1fcc0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fcd0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
1fce0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1fcf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fd00 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
1fd10 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1fd20 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
1fd30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1fd40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fd50 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1fd60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1fd70 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1fd80 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1fd90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fda0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1fdb0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1fdc0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1fdd0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1fde0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1fdf0 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1fe00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1fe10 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1fe20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1fe30 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1fe40 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1fe50 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1fe60 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1fe70 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1fe80 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1fe90 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1fea0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1feb0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1fec0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1fed0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1fee0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1fef0 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1ff00 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1ff10 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1ff20 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1ff30 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1ff40 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1ff50 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1ff60 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1ff70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1ff80 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1ff90 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1ffa0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1ffb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1ffc0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1ffd0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1ffe0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1fff0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
20000 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
20010 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
20020 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
20030 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20040 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
20050 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
20060 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
20070 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
20080 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
20090 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
200a0 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
200b0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
200c0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
200d0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
200e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
200f0 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
20100 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
20110 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
20120 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
20130 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
20140 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
20150 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
20160 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
20170 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
20180 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
20190 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
201a0 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
201b0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
201c0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
201d0 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
201e0 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
201f0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
20200 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
20210 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
20220 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
20230 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
20240 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
20250 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
20260 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
20270 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
20280 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
20290 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
202a0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
202b0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
202c0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
202d0 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
202e0 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
202f0 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
20300 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
20310 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
20320 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
20330 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
20340 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
20350 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
20360 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
20370 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
20380 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
20390 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
203a0 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
203b0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
203c0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
203d0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
203e0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
203f0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
20400 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
20410 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
20420 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
20430 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
20440 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
20450 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
20460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
20470 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
20480 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
20490 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
204a0 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
204b0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
204c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
204d0 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
204e0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
204f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
20500 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
20510 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20520 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
20530 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
20540 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
20550 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
20560 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
20570 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
20580 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
20590 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
205a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
205b0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
205c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
205d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
205e0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
205f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
20600 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
20610 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
20620 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
20630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20640 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20650 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20660 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20670 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
20680 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
20690 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
206a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
206b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
206c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
206d0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
206e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
206f0 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
20700 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20720 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
20730 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
20740 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
20750 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
20760 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
20770 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
20780 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
20790 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
207a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
207b0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
207c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
207d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
207e0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
207f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
20800 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
20810 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
20820 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20830 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
20840 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20850 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20860 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
20870 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
20880 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
20890 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
208a0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
208b0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
208c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
208d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
208e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
208f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20900 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20910 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
20920 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
20930 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20940 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20950 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
20960 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
20970 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
20980 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
20990 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
209c0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
209d0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
209e0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
209f0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
20a00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
20a10 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
20a20 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
20a30 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
20a40 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
20a50 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20a60 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
20a70 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
20a80 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
20a90 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
20aa0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
20ab0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
20ac0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
20ad0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
20ae0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
20af0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
20b00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20b10 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
20b20 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
20b30 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
20b40 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
20b50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
20b60 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
20b70 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
20b80 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
20b90 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
20ba0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
20bb0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
20bc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20bd0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
20be0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20bf0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
20c00 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
20c10 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
20c20 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
20c30 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
20c40 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
20c50 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
20c60 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20c70 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20c80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20c90 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
20ca0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
20cb0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20cc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20cd0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
20ce0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
20cf0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
20d00 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
20d10 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
20d20 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
20d30 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
20d40 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
20d60 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
20d70 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
20d80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
20d90 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b  f(v, op==TK_EQ);
20da0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
20db0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
20dc0 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  NE);.      testc
20dd0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
20de0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
20df0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
20e00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20e10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20e20 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
20e30 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
20e40 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20e50 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20e60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20e70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20e80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20e90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
20ea0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
20eb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20ec0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
20ed0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20ee0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
20ef0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20f00 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
20f10 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
20f20 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
20f30 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
20f40 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
20f50 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
20f60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20f70 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
20f80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20f90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
20fa0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
20fb0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
20fc0 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a  Expr, dest, 0, j
20fd0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
20fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
20ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21000 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
21010 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
21020 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
21030 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
21040 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
21050 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
21060 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
21070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21080 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
21090 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
210a0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
210b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
210c0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
210d0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
210e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
210f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21100 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
21110 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
21120 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21130 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
21140 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
21150 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
21160 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
21170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
21190 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
211a0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
211b0 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
211c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
211d0 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  no-op */.      }
211e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
211f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
21200 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
21210 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
21220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21230 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
21240 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
21250 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
21260 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
21270 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
21280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
21290 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
212a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
212b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
212c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
212d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
212e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
212f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21300 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
21310 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21320 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
21330 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  e2);.}../*.** Do
21340 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
21350 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
21360 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
21370 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
21380 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
21390 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
213a0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
213b0 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
213c0 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
213d0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
213e0 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
213f0 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
21400 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
21410 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
21420 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
21430 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
21440 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
21450 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
21460 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
21470 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
21480 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
21490 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
214a0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
214b0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
214c0 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
214d0 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
214e0 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
214f0 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
21500 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
21510 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
21520 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
21530 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
21540 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
21550 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
21560 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
21570 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
21580 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
21590 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
215a0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
215b0 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
215c0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
215d0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
215e0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
215f0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
21600 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
21610 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
21620 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
21630 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
21640 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
21650 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
21660 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
21670 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
21680 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
21690 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
216a0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
216b0 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
216c0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
216d0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
216e0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
216f0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
21700 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
21710 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
21720 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
21730 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
21740 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
21750 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
21760 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
21770 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
21780 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
21790 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
217a0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
217b0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
217c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
217d0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
217e0 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
217f0 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
21800 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
21810 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
21820 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
21830 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
21840 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
21850 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
21860 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
21870 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
21880 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
21890 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
218a0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
218b0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
218c0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
218d0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
218e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
218f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
21900 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
21910 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
21920 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
21930 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
21940 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
21950 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69  pA->pLeft, pB, i
21960 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
21970 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
21980 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
21990 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
219a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
219b0 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  (pA, pB->pLeft, 
219c0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
219d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
219e0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
219f0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
21a00 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
21a10 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f  WAYS(pA->op!=TK_
21a20 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70  AGG_COLUMN) && p
21a30 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
21a40 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 41     if( strcmp(pA
21a50 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
21a60 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
21a70 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
21a80 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
21a90 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
21aa0 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
21ab0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
21ac0 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
21ad0 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
21ae0 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
21af0 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
21b00 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
21b10 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
21b20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
21b30 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
21b40 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
21b50 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
21b60 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
21b70 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
21b80 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
21b90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21ba0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
21bb0 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
21bc0 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
21bd0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
21be0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
21bf0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
21c00 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
21c10 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
21c20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
21c30 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
21c40 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
21c50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
21c60 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
21c70 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
21c80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
21c90 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
21ca0 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
21cb0 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
21cc0 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
21cd0 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
21ce0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
21cf0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21d00 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
21d10 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
21d20 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
21d30 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
21d40 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
21d50 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
21d60 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
21d70 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
21d80 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
21d90 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
21da0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
21db0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
21dc0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
21dd0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
21de0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
21df0 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
21e00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21e10 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
21e20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
21e30 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
21e40 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
21e50 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
21e60 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
21e70 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
21e80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
21e90 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
21ea0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
21eb0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
21ec0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
21ed0 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
21ee0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
21ef0 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
21f00 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
21f10 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
21f20 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
21f30 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
21f40 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
21f50 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
21f60 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
21f70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
21f80 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
21f90 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
21fa0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
21fb0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
21fc0 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
21fd0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
21fe0 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
21ff0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
22000 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
22010 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
22020 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
22030 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
22040 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
22050 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
22060 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
22070 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
22080 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
22090 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
220a0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
220b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
220c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
220d0 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20  Compare(pExprA, 
220e0 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20  pExprB, iTab) ) 
220f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
22100 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
22110 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
22120 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74  f we can prove t
22130 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61  he pE2 will alwa
22140 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45  ys be true if pE
22150 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52  1 is.** true.  R
22160 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77  eturn false if w
22170 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74  e cannot complet
22180 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69  e the proof or i
22190 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62  f pE2 might.** b
221a0 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c  e false.  Exampl
221b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45  es:.**.**     pE
221c0 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45  1: x==5       pE
221d0 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
221e0 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
221f0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30  .**     pE1: x>0
22200 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d          pE2: x==
22210 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
22220 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
22230 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20     pE1: x=21    
22240 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20     pE2: x=21 OR 
22250 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a  y=43     Result:
22260 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
22270 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32  : x!=123     pE2
22280 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
22290 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
222a0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f  **     pE1: x!=?
222b0 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  1      pE2: x IS
222c0 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
222d0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
222e0 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20   pE1: x IS NULL 
222f0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
22300 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66  ULL    Result: f
22310 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
22320 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a   x IS ?2    pE2:
22330 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
22340 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a    Reuslt: false.
22350 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61  **.** When compa
22360 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  ring TK_COLUMN n
22370 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31  odes between pE1
22380 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32   and pE2, if pE2
22390 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61   has.** Expr.iTa
223a0 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d  ble<0 then assum
223b0 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  e a table number
223c0 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a   given by iTab..
223d0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
223e0 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
223f0 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
22400 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
22410 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
22420 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
22430 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
22440 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
22450 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
22460 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
22470 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
22480 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
22490 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
224a0 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
224b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
224c0 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45  iesExpr(Expr *pE
224d0 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e  1, Expr *pE2, in
224e0 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73  t iTab){.  if( s
224f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
22500 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62  e(pE1, pE2, iTab
22510 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
22520 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
22530 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
22540 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
22550 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
22560 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
22570 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab).            
22580 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
22590 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
225a0 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  pE2->pRight, iTa
225b0 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  b) ).  ){.    re
225c0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
225d0 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  ( pE2->op==TK_NO
225e0 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69  TNULL.   && sqli
225f0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
22600 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e  E1->pLeft, pE2->
22610 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a  pLeft, iTab)==0.
22620 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d     && (pE1->op!=
22630 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31  TK_ISNULL && pE1
22640 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29  ->op!=TK_IS).  )
22650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
22660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22670 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
22680 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
22690 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
226a0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
226b0 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
226c0 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
226d0 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
226e0 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
226f0 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
22700 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
22710 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
22720 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
22730 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
22740 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
22750 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
22760 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
22770 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
22780 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
22790 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
227a0 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
227b0 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
227c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
227d0 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
227e0 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
227f0 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
22800 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22810 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
22820 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
22830 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
22840 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
22850 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
22860 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
22870 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
22880 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
22890 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
228a0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
228b0 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
228c0 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
228d0 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
228e0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
228f0 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
22900 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
22910 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
22920 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
22930 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
22940 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
22950 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
22960 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
22970 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
22980 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
22990 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
229a0 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
229b0 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
229c0 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
229d0 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
229e0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
229f0 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
22a00 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
22a10 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
22a20 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
22a30 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
22a40 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
22a50 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
22a60 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
22a70 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
22a80 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
22a90 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
22aa0 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63  Src ? pSrc->nSrc
22ab0 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
22ac0 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
22ad0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
22ae0 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
22af0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
22b00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22b10 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20  if( i<nSrc ){.  
22b20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
22b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22b40 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
22b50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22b60 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22b70 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
22b80 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
22b90 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
22ba0 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
22bb0 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
22bc0 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
22bd0 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
22be0 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
22bf0 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
22c00 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
22c10 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
22c20 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
22c30 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
22c40 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
22c50 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
22c60 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
22c70 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
22c80 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
22c90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
22ca0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
22cb0 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
22cc0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
22cd0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
22ce0 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
22cf0 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
22d00 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
22d10 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
22d20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
22d30 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
22d40 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
22d50 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
22d60 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
22d70 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
22d80 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
22d90 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
22da0 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
22db0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
22dc0 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
22dd0 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
22de0 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
22df0 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
22e00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
22e10 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
22e20 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
22e30 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
22e40 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
22e50 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
22e60 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
22e70 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
22e80 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
22e90 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
22ea0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
22eb0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
22ec0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
22ed0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
22ee0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
22ef0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
22f00 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
22f10 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
22f20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
22f30 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
22f40 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
22f50 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
22f60 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
22f70 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
22f80 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
22f90 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22fa0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
22fb0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
22fc0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
22fd0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
22fe0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
22ff0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
23000 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
23010 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
23020 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
23030 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
23040 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
23050 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
23060 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
23070 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
23080 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
23090 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
230a0 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
230b0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
230c0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
230d0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
230e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
230f0 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
23100 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
23110 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
23120 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
23130 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
23140 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
23150 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
23160 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
23170 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
23180 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
23190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
231a0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
231b0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
231c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
231d0 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
231e0 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
231f0 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
23200 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
23210 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
23220 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
23230 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
23240 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
23250 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
23260 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
23270 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
23280 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
23290 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
232a0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
232b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
232c0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
232d0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
232e0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
232f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
23300 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
23310 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
23320 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
23330 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
23340 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
23350 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
23360 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
23370 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
23380 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
23390 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
233a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
233b0 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
233c0 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
233d0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
233e0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
233f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
23400 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
23410 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
23420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23430 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23440 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
23450 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
23460 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23470 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
23480 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
23490 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
234a0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
234b0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
234c0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
234d0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
234e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
234f0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
23500 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
23510 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
23520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
23530 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23540 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
23550 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
23560 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
23570 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
23580 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
23590 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
235a0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
235b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
235c0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
235d0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
235e0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
235f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
23600 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
23610 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
23620 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
23630 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
23640 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
23650 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
23660 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
23670 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
23680 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
23690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
236b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
236c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
236d0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
236e0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
236f0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
23700 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
23710 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
23720 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
23730 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23740 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
23750 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
23760 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
23770 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
23780 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
23790 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
237a0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
237b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
237c0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
237d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
237f0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
23800 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
23810 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
23820 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
23830 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
23840 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
23850 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
23860 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
23870 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
23890 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
238a0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
238b0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
238c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
238d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
238e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
238f0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
23900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23910 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
23920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23930 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
23940 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
23970 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
23980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23990 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
239a0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
239b0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
239c0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
239d0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
239e0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
239f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
23a00 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23a10 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
23a20 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
23a30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23a80 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
23a90 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
23ac0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
23ad0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
23ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23af0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
23b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23b10 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
23b20 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
23b30 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
23b40 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
23b50 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
23b60 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
23b70 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
23b80 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
23b90 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
23ba0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
23bb0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
23bc0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
23bd0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
23be0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
23bf0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
23c00 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
23c10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
23c20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
23c30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
23c40 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
23c50 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
23c60 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
23c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
23c80 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
23c90 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
23ca0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
23cb0 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
23cc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23cd0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
23ce0 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
23cf0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
23d00 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
23d10 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
23d20 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
23d30 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
23d40 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
23d50 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
23d60 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
23d70 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
23d80 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
23d90 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
23da0 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
23db0 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
23dc0 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
23dd0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
23de0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
23df0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
23e00 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
23e10 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
23e20 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
23e30 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
23e40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
23e50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23e60 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
23e70 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
23e80 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
23e90 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
23ea0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
23eb0 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
23ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23ed0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
23ee0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
23ef0 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
23f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
23f10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23f20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23f30 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
23f40 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
23f50 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
23f60 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
23f70 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
23f80 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
23f90 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
23fa0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
23fb0 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
23fc0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
23fd0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
23fe0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
23ff0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
24000 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
24010 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
24020 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
24030 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
24040 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
24050 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
24060 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
24070 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
24080 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
24090 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
240a0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
240b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
240c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
240d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
240e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
240f0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
24100 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
24110 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
24120 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
24130 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
24140 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
24150 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c  r->u.zToken, sql
24160 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
24170 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20  pr->u.zToken),. 
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
241a0 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
241b0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
241c0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
241d0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
241e0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
241f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
24200 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
24210 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
24220 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
24230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24240 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
24250 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
24260 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24280 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
24290 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
242a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
242b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
242c0 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
242d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
242e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
242f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
24300 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
24310 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
24320 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
24330 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
24340 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
24350 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
24360 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
24370 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
24380 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
24390 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
243a0 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
243b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
243c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
243d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
243e0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
243f0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
24400 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
24410 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
24420 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
24430 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
24440 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24450 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20  TER(pWalker);.  
24460 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24470 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  (pSelect);.  ret
24480 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
24490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
244a0 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
244b0 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
244c0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
244d0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
244e0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
244f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
24500 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
24510 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
24520 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
24530 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
24540 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
24550 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
24560 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
24570 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
24580 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
24590 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
245a0 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
245b0 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
245c0 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
245d0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
245e0 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
245f0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
24600 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
24610 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
24620 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
24630 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
24640 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
24650 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
24660 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
24670 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
24680 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
24690 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
246a0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
246b0 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
246c0 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
246d0 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
246e0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
246f0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
24700 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
24710 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
24720 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
24730 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
24740 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
24750 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
24760 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
24770 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
24780 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
24790 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
247a0 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
247b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
247c0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
247d0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
247e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
247f0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
24800 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
24810 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
24820 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
24830 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
24840 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
24850 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
24860 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
24870 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
24880 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
24890 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
248a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
248b0 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
248c0 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
248d0 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
248e0 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
248f0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
24900 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
24910 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
24920 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
24930 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
24940 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
24950 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
24960 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
24970 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
24980 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
24990 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
249a0 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
249b0 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
249c0 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
249d0 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
249e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
249f0 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
24a00 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
24a10 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
24a20 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
24a30 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  deallocation is 
24a40 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
24a50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
24a60 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
24a70 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
24a80 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
24a90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
24aa0 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
24ab0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
24ac0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
24ad0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
24ae0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
24af0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
24b00 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
24b10 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
24b20 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
24b30 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
24b40 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
24b50 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
24b60 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
24b70 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
24b80 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
24b90 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
24ba0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
24bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
24bc0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
24bd0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
24be0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
24bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
24c00 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
24c10 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
24c20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
24c30 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
24c40 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
24c50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24c60 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
24c70 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
24c80 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
24c90 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
24ca0 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
24cb0 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
24cc0 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
24cd0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
24ce0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
24cf0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
24d00 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
24d10 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
24d20 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
24d30 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
24d40 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
24d50 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
24d60 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
24d70 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
24d80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24d90 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
24da0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
24db0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
24dc0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
24dd0 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
24de0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
24df0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
24e00 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
24e10 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
24e20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
24e30 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
24e40 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
24e50 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
24e60 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
24e70 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
24e80 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
24e90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
24ea0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
24eb0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
24ec0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
24ed0 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
24ee0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
24ef0 7d 0a                                            }.