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

Artifact d05cc249f8615bd4655f839ee57c24d11d005dde:


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 2c 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 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0b60: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0b70: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0b80: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b90: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0ba0: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0bc0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0bd0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ATE operators an
0be0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0bf0: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c10: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c20: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c40: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c50: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c60: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c80: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ca0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cb0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cc0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0ce0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0cf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d00: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d40: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d80: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d90: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
0da0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0db0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0dc0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0dd0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0de0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0df0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e00: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0e10: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e30: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e40: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e70: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e80: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e90: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0ea0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0eb0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ec0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ef0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0f00: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0f10: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f20: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f30: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f40: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f50: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0fa0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0fb0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fc0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fe0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0ff0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
1000: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1010: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1020: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1030: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1040: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1060: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1070: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1080: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1090: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
10b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10d0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1100: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
1110: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1120: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1130: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1140: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1150: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1160: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1170: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1180: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1190: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
11a0: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
11b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11c0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11d0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11e0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11f0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
1200: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1210: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1220: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1230: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1240: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1250: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1260: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1270: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1280: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1290: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
12a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
12f0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1300: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1310: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1320: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1340: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1350: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
1370: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
1380: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
1390: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
13a0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
13b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
13c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
13d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13e0: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
13f0: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1400: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1410: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1420: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1430: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
1440: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
1450: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
1460: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
1470: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
1480: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
1490: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
14a0: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
14b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14c0: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
14d0: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
14e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
14f0: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1520: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1530: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
1540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1550: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1560: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
1570: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
1580: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
1590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
15a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
15b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1630: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
1640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1650: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
1660: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
1670: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1680: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1690: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
16a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
16b0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
16c0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
16d0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
16e0: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
16f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1700: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
1710: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
1720: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
1730: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1740: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
1750: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1760: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
1770: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
1780: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
1790: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
17a0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
17b0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
17c0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
17d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
17f0: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1800: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1810: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1820: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1830: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1840: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1850: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1860: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1870: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1880: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
1890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18a0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
18b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
18d0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  B;.    }.  }else
18e0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
18f0: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1900: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1920: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1930: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1940: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1950: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1960: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
1970: 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
1980: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
1990: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
19a0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
19b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
19c0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
19d0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
19e0: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
19f0: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1a00: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1a10: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1a30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1a40: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1a50: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1a60: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1a70: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
1a80: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
1a90: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
1aa0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
1ab0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1ac0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
1ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ae0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1af0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1b00: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b10: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1b20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1b30: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1b40: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1b50: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b70: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
1b80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
1b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1ba0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
1bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
1bc0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
1bd0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1bf0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1c00: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1c10: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1c20: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1c30: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1c40: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c60: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c70: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
1c80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1c90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
1ca0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1cb0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
1cc0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1cd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1ce0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
1cf0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1d00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1d10: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1d20: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1d30: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1d40: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1d50: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1d60: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1d70: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1d80: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
1d90: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
1da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
1db0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dc0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1dd0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1e00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1e10: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1e20: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1e30: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1e40: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1e50: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1e60: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
1e70: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
1e80: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
1e90: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
1ea0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
1eb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1ec0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1ed0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1ee0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1ef0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1f00: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f20: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1f30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1f40: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1f50: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1f60: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1f70: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1f80: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
1f90: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
1fa0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
1fb0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
1fc0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1fd0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1fe0: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1ff0: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
2000: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
2010: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
2020: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2030: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
2040: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
2050: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2070: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2080: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2090: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
20a0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
20b0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
20c0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
20d0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
20e0: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
20f0: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
2110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2120: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
2130: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
2140: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
2150: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
2160: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
2170: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
2180: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
2190: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
21a0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
21b0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
21c0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
21d0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
21e0: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
21f0: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
2200: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
2210: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
2220: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2230: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
2240: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
2250: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
2260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2270: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
2280: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
2290: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
22b0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
22c0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
22d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
22e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
22f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2300: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
2310: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
2320: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2330: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
2340: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2350: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2360: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2380: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2390: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23a0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
23b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
23c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23e0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
2410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2420: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
2430: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
2440: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
2450: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2460: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
2470: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
2480: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
2490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
24b0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
24c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
24d0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
24e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
24f0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
2500: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
2510: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
2520: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
2530: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
2540: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
2550: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
2560: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2570: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
2580: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
2590: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
25a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
25b0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
25c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
25d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
25e0: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
25f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2620: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2630: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2650: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2670: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2680: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2690: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
26c0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
26d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e0: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
26f0: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2700: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2720: 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2730: 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
2740: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
2750: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
2760: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
2770: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
2780: 20 72 65 74 75 72 6e 20 28 20 28 70 45 78 70 72   return ( (pExpr
2790: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 29  ->op==TK_VECTOR)
27a0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  .        || (pEx
27b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
27c0: 54 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 53  T && pExpr->x.pS
27d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
27e0: 45 78 70 72 3e 31 29 0a 20 20 29 3b 0a 7d 0a 0a  Expr>1).  );.}..
27f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
2800: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
2810: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2820: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
2830: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
2840: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2850: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
2860: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
2870: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
2880: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
2890: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
28a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
28b0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
28c0: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
28d0: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
28e0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
28f0: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
2900: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2910: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
2920: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2930: 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
2940: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2950: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
2960: 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
2970: 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
2980: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
2990: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
29a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
29b0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
29c0: 45 78 70 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Expr;.}..#ifndef
29d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
29e0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 49 66 20 74  QUERY./*.** If t
29f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2a00: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2a10: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a20: 54 4b 5f 56 45 43 54 4f 52 2c 20 72 65 74 75 72  TK_VECTOR, retur
2a30: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2a40: 6f 20 74 68 65 20 69 27 74 68 20 66 69 65 6c 64  o the i'th field
2a50: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 20   of the vector. 
2a60: 4f 72 2c 20 69 66 20 74 68 65 20 66 69 72 73 74  Or, if the first
2a70: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69   argument.** poi
2a80: 6e 74 73 20 74 6f 20 61 20 73 75 62 2d 73 65 6c  nts to a sub-sel
2a90: 65 63 74 20 74 68 61 74 20 72 65 74 75 72 6e 73  ect that returns
2aa0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
2ab0: 6f 6c 75 6d 6e 2c 20 72 65 74 75 72 6e 20 61 20  olumn, return a 
2ac0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
2ad0: 68 65 20 69 27 74 68 20 72 65 74 75 72 6e 65 64  he i'th returned
2ae0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 20 4f   column value. O
2af0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
2b00: 20 61 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74   a copy .** of t
2b10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2b20: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
2b30: 74 65 33 45 78 70 72 56 65 63 74 6f 72 46 69 65  te3ExprVectorFie
2b40: 6c 64 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  ld(Expr *pVector
2b50: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2b60: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2b70: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2b80: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2b90: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2ba0: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2bb0: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
2bc0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
2bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
2be0: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
2bf0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
2c00: 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
2c10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
2c20: 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ctor->x.pList->a
2c30: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
2c40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56  .  }.  return pV
2c50: 65 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ector;.}.#endif.
2c60: 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73  ./*.** If expres
2c70: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66  sion pExpr is of
2c80: 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c   type TK_SELECT,
2c90: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
2ca0: 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74  o evaluate.** it
2cb0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  . Return the reg
2cc0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
2cd0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
2ce0: 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20  red (or, if the 
2cf0: 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72  .** sub-select r
2d00: 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
2d10: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65   one column, the
2d20: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
2d30: 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65  ay.** of registe
2d40: 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  rs in which the 
2d50: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
2d60: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  )..**.** If pExp
2d70: 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45  r is not a TK_SE
2d80: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
2d90: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2da0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
2db0: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
2dc0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2dd0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
2de0: 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  g = 0;.#ifndef S
2df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e00: 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ERY.  if( pExpr-
2e10: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
2e20: 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69  {.    reg = sqli
2e30: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
2e40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
2e50: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
2e60: 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a  f.  return reg;.
2e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
2e80: 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73  t pVector points
2e90: 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70   to a vector exp
2ea0: 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72  ression - either
2eb0: 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20   a TK_VECTOR.** 
2ec0: 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61  or TK_SELECT tha
2ed0: 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  t returns more t
2ee0: 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20  han one column. 
2ef0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2f00: 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67  turns.** the reg
2f10: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  ister number of 
2f20: 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
2f30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
2f40: 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ue of.** element
2f50: 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76   iField of the v
2f60: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ector..**.** If 
2f70: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
2f80: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
2f90: 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72  n, then code for
2fa0: 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a   it must have .*
2fb0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  * already been g
2fc0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74  enerated using t
2fd0: 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  he exprCodeSubse
2fe0: 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20  lect() routine. 
2ff0: 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
3000: 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c  parameter regSel
3010: 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68  ect should be th
3020: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3030: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
3040: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .** containing t
3050: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
3060: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a  e sub-select. .*
3070: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3080: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
3090: 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20  CTOR, then code 
30a0: 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65  for the requeste
30b0: 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65  d field.** is ge
30c0: 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73  nerated. In this
30d0: 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65   case (*pRegFree
30e0: 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  ) may be set to 
30f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3100: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
3110: 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65  ister to be free
3120: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
3130: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
3140: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
3150: 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74  eturning, output
3160: 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45   parameter (*ppE
3170: 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70  xpr) is set to p
3180: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45  oint to the.** E
3190: 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  xpr object corre
31a0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d  sponding to elem
31b0: 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65  ent iElem of the
31c0: 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74   vector..*/.stat
31d0: 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f  ic int exprVecto
31e0: 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72  rRegister(.  Par
31f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3210: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
3220: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3240: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20     /* Vector to 
3250: 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20  extract element 
3260: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46  from */.  int iF
3270: 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  ield,           
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65            /* Fie
3290: 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  ld to extract fr
32a0: 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20  om pVector */.  
32b0: 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20  int regSelect,  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
32e0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
32f0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70  /.  Expr **ppExp
3300: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
3310: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72      /* OUT: Expr
3320: 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a  ession element *
3330: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65  /.  int *pRegFre
3340: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3350: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70      /* OUT: Temp
3360: 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
3370: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
3380: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3390: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 70 56 65 63  K_VECTOR || pVec
33a0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
33b0: 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
33c0: 28 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b  (pVector->op==TK
33d0: 5f 56 45 43 54 4f 52 29 3d 3d 28 72 65 67 53 65  _VECTOR)==(regSe
33e0: 6c 65 63 74 3d 3d 30 29 20 29 3b 0a 20 20 69 66  lect==0) );.  if
33f0: 28 20 72 65 67 53 65 6c 65 63 74 20 29 7b 0a 20  ( regSelect ){. 
3400: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65     *ppExpr = pVe
3410: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
3420: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  >pEList->a[iFiel
3430: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72  d].pExpr;.     r
3440: 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b  eturn regSelect+
3450: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70  iField;.  }.  *p
3460: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
3470: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3480: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74  ld].pExpr;.  ret
3490: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
34a0: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
34b0: 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65  *ppExpr, pRegFre
34c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  e);.}../*.** Exp
34d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
34e0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
34f0: 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72  tween two vector
3500: 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65   values. Compute
3510: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f  .** the result o
3520: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
3530: 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 74 6f   and write it to
3540: 20 72 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a   register dest..
3550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3560: 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72 65  odeVectorCompare
3570: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3580: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3590: 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65 20 2a   dest){.  Vdbe *
35a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
35b0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  e;.  Expr *pLeft
35c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
35d0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
35e0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
35f0: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73  .  int nLeft = s
3600: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
3610: 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69  Size(pLeft);.  i
3620: 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69  nt nRight = sqli
3630: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
3640: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  e(pRight);.  int
3650: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3660: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
3670: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
3680: 74 20 62 6f 74 68 20 73 69 64 65 73 20 6f 66 20  t both sides of 
3690: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  the comparison a
36a0: 72 65 20 76 65 63 74 6f 72 73 2c 20 61 6e 64 20  re vectors, and 
36b0: 74 68 61 74 0a 20 20 2a 2a 20 62 6f 74 68 20 61  that.  ** both a
36c0: 72 65 20 74 68 65 20 73 61 6d 65 20 6c 65 6e 67  re the same leng
36d0: 74 68 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 4c  th.  */.  if( nL
36e0: 65 66 74 21 3d 6e 52 69 67 68 74 20 29 7b 0a 20  eft!=nRight ){. 
36f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3700: 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76 61  sg(pParse, "inva
3710: 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76  lid use of row v
3720: 61 6c 75 65 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  alue");.  }else{
3730: 0a 20 20 20 20 69 6e 74 20 70 35 20 3d 20 28 70  .    int p5 = (p
3740: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
3750: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
3760: 5f 49 53 4e 4f 54 29 20 3f 20 53 51 4c 49 54 45  _ISNOT) ? SQLITE
3770: 5f 4e 55 4c 4c 45 51 20 3a 20 30 3b 0a 20 20 20  _NULLEQ : 0;.   
3780: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
3790: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  regLeft = 0;.   
37a0: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
37b0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 54 6d  0;.    int regTm
37c0: 70 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65  p = 0;..    asse
37d0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
37e0: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
37f0: 70 3d 3d 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20  p==TK_NE .      
3800: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
3810: 3d 54 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d  =TK_IS || pExpr-
3820: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20  >op==TK_ISNOT . 
3830: 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
3840: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
3850: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
3860: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78  .         || pEx
3870: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
3880: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
3890: 45 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  E .    );..    i
38a0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
38b0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
38c0: 3d 3d 54 4b 5f 4e 45 20 29 7b 0a 20 20 20 20 20  ==TK_NE ){.     
38d0: 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74 65   regTmp = sqlite
38e0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
38f0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
3900: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3910: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 28 70 45 78  OP_Integer, (pEx
3920: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 29 2c 20  pr->op==TK_EQ), 
3930: 64 65 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  dest);.    }..  
3940: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
3950: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
3960: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
3970: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
3980: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
3990: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
39a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
39b0: 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLeft; i++){.   
39c0: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
39d0: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
39e0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
39f0: 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20 69  L, *pR; .      i
3a00: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  nt r1, r2;.     
3a10: 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
3a20: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
3a30: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 31 20  arse);.      r1 
3a40: 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65 67 69  = exprVectorRegi
3a50: 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  ster(pParse, pLe
3a60: 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74 2c 20  ft, i, regLeft, 
3a70: 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31 29 3b  &pL, &regFree1);
3a80: 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78 70 72  .      r2 = expr
3a90: 56 65 63 74 6f 72 52 65 67 69 73 74 65 72 28 70  VectorRegister(p
3aa0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 69  Parse, pRight, i
3ab0: 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70 52 2c  , regRight, &pR,
3ac0: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 0a 20 20   &regFree2);..  
3ad0: 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
3ae0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  r->op ){.       
3af0: 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
3b00: 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
3b10: 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  re(.            
3b20: 20 20 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52    pParse, pL, pR
3b30: 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 72 32 2c  , OP_Eq, r1, r2,
3b40: 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53 54   dest, SQLITE_ST
3b50: 4f 52 45 50 32 7c 53 51 4c 49 54 45 5f 4e 55 4c  OREP2|SQLITE_NUL
3b60: 4c 45 51 0a 20 20 20 20 20 20 20 20 20 20 29 3b  LEQ.          );
3b70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3b80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3b90: 4f 50 5f 49 66 4e 6f 74 2c 20 64 65 73 74 2c 20  OP_IfNot, dest, 
3ba0: 61 64 64 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  addr, 1);.      
3bb0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
3bc0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  (v);.          b
3bd0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63  reak;..        c
3be0: 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
3bf0: 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
3c00: 61 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  are(.           
3c10: 20 20 20 70 50 61 72 73 65 2c 20 70 4c 2c 20 70     pParse, pL, p
3c20: 52 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 72 32  R, OP_Ne, r1, r2
3c30: 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53  , dest, SQLITE_S
3c40: 54 4f 52 45 50 32 7c 53 51 4c 49 54 45 5f 4e 55  TOREP2|SQLITE_NU
3c50: 4c 4c 45 51 0a 20 20 20 20 20 20 20 20 20 20 29  LLEQ.          )
3c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
3c70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3c80: 20 4f 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64   OP_If, dest, ad
3c90: 64 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  dr, 1);.        
3ca0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
3cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
3cc0: 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63 61 73  ak;..        cas
3cd0: 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 20 20 20  e TK_EQ:.       
3ce0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
3cf0: 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
3d00: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
3d10: 52 2c 20 4f 50 5f 43 6d 70 2c 20 72 31 2c 20 72  R, OP_Cmp, r1, r
3d20: 32 2c 20 72 65 67 54 6d 70 2c 53 51 4c 49 54 45  2, regTmp,SQLITE
3d30: 5f 53 54 4f 52 45 50 32 7c 70 35 29 3b 0a 20 20  _STOREP2|p5);.  
3d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3d50: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
3d70: 50 5f 43 6d 70 54 65 73 74 2c 20 72 65 67 54 6d  P_CmpTest, regTm
3d80: 70 2c 20 61 64 64 72 2c 20 64 65 73 74 2c 20 70  p, addr, dest, p
3d90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 0a  Expr->op==TK_NE.
3da0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
3db0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
3dc0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
3dd0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
3de0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
3df0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45        case TK_LE
3e00: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  :.        case T
3e10: 4b 5f 47 54 3a 0a 20 20 20 20 20 20 20 20 63 61  K_GT:.        ca
3e20: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20  se TK_GE:.      
3e30: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
3e40: 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20  pParse, pL, pR, 
3e50: 4f 50 5f 43 6d 70 2c 20 72 31 2c 20 72 32 2c 20  OP_Cmp, r1, r2, 
3e60: 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53 54 4f  dest, SQLITE_STO
3e70: 52 45 50 32 7c 70 35 29 3b 0a 20 20 20 20 20 20  REP2|p5);.      
3e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3e90: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 43  ddOp4Int(v, OP_C
3ea0: 6d 70 54 65 73 74 2c 20 64 65 73 74 2c 20 61 64  mpTest, dest, ad
3eb0: 64 72 2c 20 30 2c 20 70 45 78 70 72 2d 3e 6f 70  dr, 0, pExpr->op
3ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
3ed0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
3ee0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3ef0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
3f00: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3f10: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
3f20: 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
3f30: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3f40: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
3f50: 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ee2);.      if( 
3f60: 69 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  i ) sqlite3ExprC
3f70: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
3f80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
3f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
3fa0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
3fb0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
3fc0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
3fd0: 6c 28 76 2c 20 61 64 64 72 29 3b 0a 7d 0a 0a 23  l(v, addr);.}..#
3fe0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
3ff0: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
4000: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
4010: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
4020: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
4030: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
4040: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
4050: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
4060: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
4070: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
4080: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
4090: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
40a0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
40b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
40c0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
40d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
40e0: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
40f0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
4100: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4110: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
4120: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
4130: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
4140: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4150: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
4160: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
4170: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
4180: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
4190: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
41a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
41b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
41c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
41d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
41e0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
41f0: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
4200: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
4210: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
4220: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
4230: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
4240: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
4250: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
4260: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
4270: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
4280: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
4290: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
42a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
42b0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
42c0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
42d0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
42e0: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
42f0: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
4300: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
4310: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
4320: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
4330: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
4340: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
4350: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
4360: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
4370: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
4380: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
4390: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
43a0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
43b0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
43c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
43d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
43e0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
43f0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
4400: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
4410: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
4420: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
4430: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
4440: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
4450: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
4460: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
4470: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
4480: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
4490: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
44a0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
44b0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
44c0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
44d0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
44e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
44f0: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
4500: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
4510: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
4520: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
4530: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
4540: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
4550: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
4560: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
4570: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
4580: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
4590: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
45a0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
45b0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
45c0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
45d0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
45e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
45f0: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
4600: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
4610: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
4620: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
4630: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
4640: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
4650: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
4660: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
4670: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
4680: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
4690: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
46a0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
46b0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
46c0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
46d0: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
46e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
46f0: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
4700: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
4710: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
4720: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
4730: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
4740: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
4750: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
4760: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
4770: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
4780: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
4790: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
47a0: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
47b0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
47c0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
47d0: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
47e0: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
47f0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
4800: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4810: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
4820: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
4830: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
4840: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
4850: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
4860: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
4870: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
4880: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
4890: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
48a0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
48b0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
48c0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
48d0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
48e0: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
48f0: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
4900: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
4910: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
4920: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
4930: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
4940: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
4950: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
4960: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
4970: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
4980: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
4990: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
49a0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
49b0: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
49c0: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
49d0: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
49e0: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
49f0: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
4a00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
4a10: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4a20: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
4a30: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
4a40: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
4a50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
4a60: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
4a80: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
4a90: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
4aa0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4ab0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
4ac0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
4ad0: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
4ae0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
4af0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
4b00: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
4b10: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
4b20: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
4b30: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
4b40: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
4b50: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
4b60: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
4b70: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
4b80: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
4b90: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
4ba0: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
4bb0: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
4bc0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
4bd0: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
4be0: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
4bf0: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
4c00: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
4c10: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
4c20: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
4c30: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4c40: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
4c50: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
4c60: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
4c70: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
4c80: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4c90: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4ca0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
4cb0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
4cc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4cd0: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
4ce0: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
4cf0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
4d00: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4d10: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
4d20: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
4d30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
4d40: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
4d50: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
4d60: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
4d70: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
4d80: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
4d90: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
4da0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
4db0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
4dc0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
4dd0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
4de0: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
4df0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
4e00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
4e10: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
4e20: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
4e30: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
4e40: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
4e50: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
4e60: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
4e70: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
4e80: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
4e90: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
4ea0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
4eb0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
4ec0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
4ed0: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
4ee0: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
4ef0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
4f00: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
4f10: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
4f20: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
4f30: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
4f40: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
4f50: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
4f60: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
4f70: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
4f80: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
4f90: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
4fa0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
4fb0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
4fc0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
4fd0: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
4fe0: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
4ff0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
5000: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
5010: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
5020: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
5030: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
5040: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
5050: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
5060: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
5070: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
5080: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
5090: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
50a0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
50b0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
50c0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
50d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
50e0: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
50f0: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
5100: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
5110: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
5120: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
5130: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
5140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
5150: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
5160: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
5170: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
5180: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
5190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
51a0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
51b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
51c0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
51d0: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
51e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
51f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5210: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
5220: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
5230: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
5240: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
5250: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
5260: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
5270: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
5280: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
5290: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
52a0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
52b0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
52c0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
52d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
52e0: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
52f0: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
5300: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
5310: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
5320: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5330: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
5340: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
5350: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
5360: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
5370: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
5380: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
5390: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
53a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
53b0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
53c0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
53d0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
53e0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
53f0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
5400: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
5410: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
5420: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5430: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
5440: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
5450: 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
5460: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
5470: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30   || pToken->n==0
5480: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
5490: 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63  pToken->n ) memc
54a0: 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  py(pNew->u.zToke
54b0: 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  n, pToken->z, pT
54c0: 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  oken->n);.      
54d0: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
54e0: 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b  [pToken->n] = 0;
54f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71  .        if( deq
5500: 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49  uote && sqlite3I
5510: 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  squote(pNew->u.z
5520: 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20  Token[0]) ){.   
5530: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
5540: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22  >u.zToken[0]=='"
5550: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
5560: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
5570: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5580: 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Dequote(pNew->
5590: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
55a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
55b0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
55c0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
55d0: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
55e0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
55f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
5600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
5610: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
5620: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
5630: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
5640: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
5650: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
5660: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
5670: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
5680: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
5690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
56a0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
56b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
56c0: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
56d0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
56e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
56f0: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
5700: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5710: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
5720: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
5730: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
5740: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
5750: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
5760: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
5770: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
5780: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
5790: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
57a0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
57b0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
57c0: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
57d0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
57e0: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
57f0: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
5800: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
5810: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
5820: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5830: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5840: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
5850: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
5860: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
5870: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
5880: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
5890: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
58a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
58b0: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
58c0: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
58d0: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
58e0: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
58f0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
5900: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5910: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5920: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
5930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5940: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
5950: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
5960: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
5970: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
5980: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
5990: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
59a0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
59b0: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
59c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
59d0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
59e0: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
59f0: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
5a00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
5a10: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
5a20: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
5a30: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
5a40: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
5a50: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
5a60: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
5a70: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
5a80: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
5a90: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
5aa0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
5ab0: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
5ac0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
5ad0: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
5ae0: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
5af0: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
5b00: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
5b10: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
5b20: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
5b30: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
5b40: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
5b50: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
5b60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5b70: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
5b80: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5b90: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5bb0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
5bc0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
5bd0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
5be0: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
5bf0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
5c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
5c10: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
5c20: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
5c30: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
5c40: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
5c50: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
5c60: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
5c70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
5c80: 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61  ){.    /* Take a
5c90: 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72  dvantage of shor
5ca0: 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20  t-circuit false 
5cb0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
5cc0: 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20   AND */.    p = 
5cd0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
5ce0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74  Parse->db, pLeft
5cf0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
5d00: 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  se{.    p = sqli
5d10: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
5d20: 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b  rse->db, op & TK
5d30: 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e  FLG_MASK, pToken
5d40: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
5d50: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
5d60: 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ees(pParse->db, 
5d70: 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  p, pLeft, pRight
5d80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  );.  }.  if( p )
5d90: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
5da0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
5db0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
5dc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5dd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
5de0: 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45  pSelect to the E
5df0: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69  xpr.x.pSelect fi
5e00: 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78  eld.  Or, if pEx
5e10: 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a  pr is NULL (due.
5e20: 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61  ** do a memory a
5e30: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
5e40: 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  e) then delete t
5e50: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
5e60: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5e70: 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
5e80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e90: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c  Expr *pExpr, Sel
5ea0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
5eb0: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
5ec0: 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65    pExpr->x.pSele
5ed0: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
5ee0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
5ef0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
5f00: 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72  elect|EP_Subquer
5f10: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
5f20: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
5f30: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78  lags(pParse, pEx
5f40: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
5f50: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5f60: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5f70: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
5f80: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
5f90: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63  arse->db, pSelec
5fa0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
5fb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5fc0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
5fd0: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
5fe0: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
5ff0: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
6000: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
6010: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
6020: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
6030: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6040: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
6050: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
6060: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
6070: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
6080: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
6090: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
60a0: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
60b0: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
60c0: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
60d0: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
60e0: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
60f0: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
6100: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
6110: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
6120: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
6130: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
6140: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
6150: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
6160: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
6170: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
6180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6190: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
61a0: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
61b0: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
61c0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
61d0: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
61e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
61f0: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
6200: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
6210: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
6220: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
6230: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
6240: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
6250: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
6260: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
6270: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
6280: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
6290: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
62a0: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
62b0: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
62c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
62d0: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
62e0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
62f0: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
6300: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6310: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
6320: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
6330: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6340: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
6350: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
6360: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
6370: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
6380: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
6390: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
63a0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
63b0: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
63c0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
63d0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
63e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
63f0: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
6400: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
6410: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
6420: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
6430: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
6440: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
6450: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
6460: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
6470: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
6480: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
6490: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
64a0: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
64b0: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
64c0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
64d0: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
64e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
64f0: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
6500: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
6510: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
6520: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
6530: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
6540: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
6550: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
6560: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
6570: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
6580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6590: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
65a0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
65b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
65c0: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
65d0: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
65e0: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
65f0: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
6600: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
6610: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
6620: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
6630: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
6640: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
6650: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
6660: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
6670: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
6680: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
6690: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
66a0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
66b0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
66c0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
66d0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
66e0: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
66f0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
6700: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
6710: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
6720: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
6730: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6740: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
6750: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
6760: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6770: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
6780: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
6790: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
67a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
67b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
67c0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
67d0: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
67e0: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
67f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6800: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
6810: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
6820: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
6830: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
6840: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
6850: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
6860: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
6870: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
6880: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
6890: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
68a0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
68b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
68c0: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
68d0: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
68e0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
68f0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
6900: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
6910: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
6920: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
6930: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
6940: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
6950: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
6960: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
6970: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
6980: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
6990: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
69a0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
69b0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
69c0: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
69d0: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
69e0: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
69f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
6a00: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
6a10: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
6a20: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
6a30: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
6a40: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
6a50: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
6a60: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
6a70: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
6a80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6a90: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
6aa0: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
6ab0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
6ac0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
6ad0: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
6ae0: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
6af0: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
6b00: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
6b10: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
6b20: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
6b30: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6b40: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
6b50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6b60: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
6b70: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
6b80: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
6b90: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
6ba0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
6bb0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
6bc0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
6bd0: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
6be0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
6bf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
6c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
6c10: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
6c20: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
6c30: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
6c40: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
6c50: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
6c60: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
6c70: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
6c80: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
6c90: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
6ca0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
6cb0: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
6cc0: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
6cd0: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
6ce0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
6cf0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
6d00: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
6d10: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
6d20: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
6d30: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
6d40: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
6d50: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
6d60: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
6d70: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
6d80: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
6d90: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
6da0: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
6db0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
6dc0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
6dd0: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
6de0: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
6df0: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
6e00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6e10: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
6e20: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
6e30: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6e40: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
6e50: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
6e60: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
6e70: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
6e80: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
6e90: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
6ea0: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
6eb0: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
6ec0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
6ed0: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
6ee0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6ef0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6f00: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
6f10: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
6f20: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
6f30: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
6f40: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
6f50: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
6f60: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
6f70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6f80: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
6f90: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
6fa0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
6fb0: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
6fc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fd0: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
6fe0: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
6ff0: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
7000: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
7010: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
7020: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
7030: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
7040: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
7050: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
7060: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
7070: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
7080: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
7090: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
70a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
70b0: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
70c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
70d0: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
70e0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
70f0: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
7100: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
7110: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
7120: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7130: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
7140: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
7150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7160: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7170: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
7180: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
7190: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
71a0: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
71b0: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
71c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
71d0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
71e0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
71f0: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
7200: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
7210: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
7220: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
7230: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
7240: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7250: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
7260: 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45  ocFailed ); /* E
7270: 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68  rror reported th
7280: 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c  rough mallocFail
7290: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
72a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
72b0: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
72c0: 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20  ->azVar = a;.   
72d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70       memset(&a[p
72e0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30  Parse->nzVar], 0
72f0: 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56  , (x-pParse->nzV
7300: 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  ar)*sizeof(a[0])
7310: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
7320: 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20  e->nzVar = x;.  
7330: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7340: 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61  z[0]!='?' || pPa
7350: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d  rse->azVar[x-1]=
7360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
7370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7380: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
7390: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  1]);.        pPa
73a0: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20  rse->azVar[x-1] 
73b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
73c0: 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20  up(db, z, n);.  
73d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
73e0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
73f0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
7400: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
7410: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
7420: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
7430: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7440: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
7450: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
7460: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
7470: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
7480: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
7490: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
74a0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
74b0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
74c0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
74d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
74e0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
74f0: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
7500: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
7510: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
7520: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
7530: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
7540: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
7550: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7560: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
7570: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
7580: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
7590: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
75a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
75b0: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
75c0: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
75d0: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
75e0: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
75f0: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
7600: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
7610: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
7620: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
7630: 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f  op!=TK_SELECT_CO
7640: 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45 78  LUMN ) sqlite3Ex
7650: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
7660: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
7670: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7680: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
7690: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
76a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
76b0: 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44  oken) ) sqlite3D
76c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a  bFree(db, p->u.z
76d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  Token);.    if( 
76e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
76f0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
7700: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7710: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
7720: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
7730: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7740: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7750: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
7760: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
7770: 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61   }.  if( !ExprHa
7780: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7790: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73  Static) ){.    s
77a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
77b0: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
77c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
77d0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
77e0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
77f0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
7800: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
7810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7820: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
7830: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
7840: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7850: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
7860: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
7870: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
7880: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
7890: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
78a0: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
78b0: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
78c0: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
78d0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
78e0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
78f0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
7900: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
7910: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
7920: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
7930: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
7940: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
7950: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
7960: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
7970: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
7980: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
7990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
79a0: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
79b0: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
79c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
79d0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
79e0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
79f0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
7a00: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
7a10: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
7a20: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
7a30: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
7a40: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
7a50: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
7a60: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
7a70: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
7a80: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
7a90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
7aa0: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
7ab0: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
7ac0: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
7ad0: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
7ae0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
7af0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
7b00: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
7b10: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b60: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
7b70: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
7b80: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
7b90: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
7ba0: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
7bb0: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
7bc0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
7bd0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
7be0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
7bf0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
7c00: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
7c10: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
7c20: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
7c30: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
7c40: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
7c50: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
7c60: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
7c70: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
7c80: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
7c90: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
7ca0: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
7cb0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
7cc0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
7cd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
7ce0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
7cf0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
7d00: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
7d10: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
7d20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
7d30: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
7d40: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
7d50: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
7d60: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
7d70: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
7d80: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
7d90: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
7da0: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
7db0: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
7dc0: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
7dd0: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
7de0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
7df0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
7e00: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
7e10: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
7e20: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
7e30: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
7e40: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
7e50: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
7e60: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
7e70: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
7e80: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
7e90: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
7ea0: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
7eb0: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
7ec0: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
7ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
7ee0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
7ef0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
7f00: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
7f10: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
7f20: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
7f30: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
7f40: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
7f50: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
7f60: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
7f70: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
7f80: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
7f90: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
7fa0: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
7fb0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
7fc0: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
7fd0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
7fe0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
7ff0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
8000: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
8010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
8020: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8030: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
8040: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
8050: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
8060: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8070: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
8080: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
8090: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
80a0: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
80b0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
80c0: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
80d0: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
80e0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
80f0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
8100: 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a 20 20 20   0==flags ){.   
8110: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55   nSize = EXPR_FU
8120: 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b  LLSIZE;.  }else{
8130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
8140: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8150: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
8160: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
8170: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8180: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8190: 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20  FromJoin) ); .  
81a0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
81b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
81c0: 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20  _MemToken) );.  
81d0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
81e0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
81f0: 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20  _NoReduce) );.  
8200: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c    if( p->pLeft |
8210: 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  | p->x.pList ){.
8220: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
8230: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c  PR_REDUCEDSIZE |
8240: 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20   EP_Reduced;.   
8250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
8260: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d  sert( p->pRight=
8270: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 );.      nSiz
8280: 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  e = EXPR_TOKENON
8290: 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65  LYSIZE | EP_Toke
82a0: 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nOnly;.    }.  }
82b0: 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b  .  return nSize;
82c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
82d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
82e0: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
82f0: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
8300: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a  tore the copy .*
8310: 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  * of the Expr st
8320: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f  ructure and a co
8330: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75  py of the Expr.u
8340: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28  .zToken string (
8350: 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e  if that.** strin
8360: 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a  g is defined.).*
8370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
8380: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45  edExprNodeSize(E
8390: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
83a0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
83b0: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
83c0: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20  tSize(p, flags) 
83d0: 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21  & 0xfff;.  if( !
83e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
83f0: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
8400: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
8410: 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  {.    nByte += s
8420: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
8430: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20  ->u.zToken)+1;. 
8440: 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e   }.  return ROUN
8450: 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  D8(nByte);.}../*
8460: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8470: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
8480: 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
8490: 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  e a duplicate of
84a0: 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73   the .** express
84b0: 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
84c0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
84d0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
84e0: 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61  ument is a.** ma
84f0: 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58  sk containing EX
8500: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
8510: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
8520: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
8530: 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61  es space to crea
8540: 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  te a copy of the
8550: 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20   Expr struct.** 
8560: 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62  itself and the b
8570: 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74  uffer referred t
8580: 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  o by Expr.u.zTok
8590: 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  en, if any..**.*
85a0: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
85b0: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
85c0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65  set, then the re
85d0: 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75  turn value inclu
85e0: 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f  des .** space to
85f0: 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45   duplicate all E
8600: 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65  xpr nodes in the
8610: 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20   tree formed by 
8620: 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61  Expr.pLeft .** a
8630: 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76  nd Expr.pRight v
8640: 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f  ariables (but no
8650: 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74  t for any struct
8660: 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  ures pointed to 
8670: 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64  or .** descended
8680: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
8690: 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78  .pList or Expr.x
86a0: 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c  .pSelect variabl
86b0: 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es)..*/.static i
86c0: 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  nt dupedExprSize
86d0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
86e0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
86f0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
8700: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75  {.    nByte = du
8710: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
8720: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  p, flags);.    i
8730: 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50  f( flags&EXPRDUP
8740: 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20  _REDUCE ){.     
8750: 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45   nByte += dupedE
8760: 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74  xprSize(p->pLeft
8770: 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64  , flags) + duped
8780: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67  ExprSize(p->pRig
8790: 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ht, flags);.    
87a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
87b0: 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Byte;.}../*.** T
87c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
87d0: 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
87e0: 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63  e3ExprDup(), exc
87f0: 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75  ept that if pzBu
8800: 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  ffer .** is not 
8810: 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66  NULL then *pzBuf
8820: 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  fer is assumed t
8830: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
8840: 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  fer large enough
8850: 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68   .** to store th
8860: 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73  e copy of expres
8870: 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69  sion p, the copi
8880: 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65  es of p->u.zToke
8890: 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61  n.** (if applica
88a0: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
88b0: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
88c0: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
88d0: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
88e0: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
88f0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
8900: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
8910: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
8920: 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74  past the.** port
8930: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65  ion of the buffe
8940: 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79  r copied into by
8950: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8960: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
8970: 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  exprDup(sqlite3 
8980: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
8990: 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a  t dupFlags, u8 *
89a0: 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78  *pzBuffer){.  Ex
89b0: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
89c0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
89d0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a  return */.  u8 *
89e0: 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  zAlloc;         
89f0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63    /* Memory spac
8a00: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
8a10: 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63  build Expr objec
8a20: 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69  t */.  u32 stati
8a30: 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  cFlag;       /* 
8a40: 45 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61  EP_Static if spa
8a50: 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  ce not obtained 
8a60: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a  from malloc */..
8a70: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
8a80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
8a90: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46  ;.  assert( dupF
8aa0: 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  lags==0 || dupFl
8ab0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8ac0: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
8ad0: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
8ae0: 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55  dupFlags==EXPRDU
8af0: 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f  P_REDUCE );..  /
8b00: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
8b10: 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
8b20: 6e 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75  new Expr structu
8b30: 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42  re. */.  if( pzB
8b40: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c  uffer ){.    zAl
8b50: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
8b60: 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20  .    staticFlag 
8b70: 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d  = EP_Static;.  }
8b80: 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63  else{.    zAlloc
8b90: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8ba0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65  ocRawNN(db, dupe
8bb0: 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70  dExprSize(p, dup
8bc0: 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61  Flags));.    sta
8bd0: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d  ticFlag = 0;.  }
8be0: 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20  .  pNew = (Expr 
8bf0: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28  *)zAlloc;..  if(
8c00: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20   pNew ){.    /* 
8c10: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
8c20: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
8c30: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
8c40: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
8c50: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
8c60: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
8c70: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
8c80: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
8c90: 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f  r.    ** EXPR_TO
8ca0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f  KENONLYSIZE. nTo
8cb0: 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
8cc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8cd0: 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a  s consumed.    *
8ce0: 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66  * by the copy of
8cf0: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
8d00: 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29   string (if any)
8d10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e  ..    */.    con
8d20: 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72  st unsigned nStr
8d30: 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45  uctSize = dupedE
8d40: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
8d50: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
8d60: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
8d70: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
8d80: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e   & 0xfff;.    in
8d90: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  t nToken;.    if
8da0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
8db0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
8dc0: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
8dd0: 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  n ){.      nToke
8de0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
8df0: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
8e00: 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   + 1;.    }else{
8e10: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
8e20: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
8e30: 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20   dupFlags ){.   
8e40: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
8e50: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8e60: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
8e70: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
8e80: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
8e90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8ea0: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
8eb0: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
8ec0: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65  ize(p);.      me
8ed0: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
8ee0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
8ef0: 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c  ( nSize<EXPR_FUL
8f00: 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20  LSIZE ){ .      
8f10: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
8f20: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
8f30: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
8f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8f50: 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
8f60: 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54  EP_Reduced, EP_T
8f70: 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50  okenOnly, and EP
8f80: 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70  _Static flags ap
8f90: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a  propriately. */.
8fa0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
8fb0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
8fc0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8fd0: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
8fe0: 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  en);.    pNew->f
8ff0: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
9000: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
9010: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
9020: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9030: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
9040: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
9050: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
9060: 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  ing, if any. */.
9070: 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
9080: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
9090: 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a  oken = pNew->u.z
90a0: 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26  Token = (char*)&
90b0: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
90c0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
90d0: 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  Token, p->u.zTok
90e0: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
90f0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   }..    if( 0==(
9100: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
9110: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
9120: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
9130: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
9140: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
9150: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
9160: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
9170: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
9180: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
9190: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
91a0: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
91b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
91c0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  Dup(db, p->x.pSe
91d0: 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b  lect, dupFlags);
91e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
91f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
9200: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
9210: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
9220: 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67  x.pList, dupFlag
9230: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
9240: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  }..    /* Fill i
9250: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
9260: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
9270: 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  */.    if( ExprH
9280: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
9290: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
92a0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
92b0: 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70     zAlloc += dup
92c0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
92d0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
92e0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
92f0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
9300: 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20  Reduced) ){.    
9310: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
9320: 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20  = p->pLeft ?.   
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
9350: 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50  ->pLeft, EXPRDUP
9360: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
9370: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70  ) : 0;.        p
9380: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d  New->pRight = p-
9390: 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20  >pRight ?.      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
93c0: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
93d0: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
93e0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   : 0;.      }.  
93f0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
9400: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42   ){.        *pzB
9410: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
9420: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9430: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  e{.      if( !Ex
9440: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9450: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
9460: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
9470: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
9480: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
9490: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
94a0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
94b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
94c0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
94d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
94f0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  w;.}../*.** Crea
9500: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
9510: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
9520: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
9530: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
9540: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e   argument. If an
9550: 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69   OOM condition i
9560: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e  s encountered, N
9570: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
9580: 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d  ** and the db->m
9590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
95a0: 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   set..*/.#ifndef
95b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
95c0: 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69  .static With *wi
95d0: 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  thDup(sqlite3 *d
95e0: 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57  b, With *p){.  W
95f0: 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ith *pRet = 0;. 
9600: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
9610: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
9620: 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d  (*p) + sizeof(p-
9630: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74  >a[0]) * (p->nCt
9640: 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  e-1);.    pRet =
9650: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9660: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
9670: 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b  .    if( pRet ){
9680: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9690: 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d      pRet->nCte =
96a0: 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20   p->nCte;.      
96b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
96c0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
96d0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65    pRet->a[i].pSe
96e0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
96f0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61  lectDup(db, p->a
9700: 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  [i].pSelect, 0);
9710: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
9720: 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69  [i].pCols = sqli
9730: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9740: 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73  b, p->a[i].pCols
9750: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
9760: 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  et->a[i].zName =
9770: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9780: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  (db, p->a[i].zNa
9790: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
97a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
97b0: 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  pRet;.}.#else.# 
97c0: 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78  define withDup(x
97d0: 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y) 0.#endif../*
97e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
97f0: 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  g group of routi
9800: 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f  nes make deep co
9810: 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  pies of expressi
9820: 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69  ons,.** expressi
9830: 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73  on lists, ID lis
9840: 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73  ts, and select s
9850: 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20  tatements.  The 
9860: 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65  copies can.** be
9870: 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69   deleted (by bei
9880: 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ng passed to the
9890: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e  ir respective ..
98a0: 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e  .Delete() routin
98b0: 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65  es).** without e
98c0: 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69  ffecting the ori
98d0: 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ginals..**.** Th
98e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
98f0: 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63  t, ID, and sourc
9900: 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62  e lists return b
9910: 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  y sqlite3ExprLis
9920: 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74  tDup(),.** sqlit
9930: 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61  e3IdListDup(), a
9940: 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  nd sqlite3SrcLis
9950: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
9960: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
9970: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
9980: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
9990: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
99a0: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
99b0: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
99c0: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
99d0: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
99e0: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
99f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
9a00: 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
9a10: 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ins a combinatio
9a20: 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50  n of the EXPRDUP
9a30: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49  _XXX flags..** I
9a40: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
9a50: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
9a60: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
9a70: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
9a80: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
9a90: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
9aa0: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
9ab0: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
9ac0: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
9ad0: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
9ae0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
9af0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
9b00: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
9b10: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
9b20: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9b30: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
9b40: 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66  gs){.  assert( f
9b50: 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
9b60: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
9b70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f   );.  return p ?
9b80: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
9b90: 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d  flags, 0) : 0;.}
9ba0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
9bb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
9bc0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
9bd0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
9be0: 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  s){.  ExprList *
9bf0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
9c00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
9c10: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
9c20: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
9c30: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
9c40: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
9c50: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
9c60: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9c70: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
9c80: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
9c90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9ca0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
9cb0: 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  i = p->nExpr;.  
9cc0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50  if( (flags & EXP
9cd0: 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20  RDUP_REDUCE)==0 
9ce0: 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e  ) for(i=1; i<p->
9cf0: 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20  nExpr; i+=i){}. 
9d00: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
9d10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9d20: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73  ocRawNN(db,  i*s
9d30: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
9d40: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
9d50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
9d60: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
9d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9d80: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
9d90: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
9da0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
9db0: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
9dc0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
9dd0: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
9de0: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
9df0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
9e00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9e10: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
9e20: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
9e30: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
9e40: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
9e50: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
9e60: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
9e70: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9e80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
9e90: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
9ea0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
9eb0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
9ec0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
9ed0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
9ee0: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
9ef0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
9f00: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
9f10: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
9f20: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
9f30: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
9f40: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
9f50: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
9f60: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
9f70: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
9f80: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
9f90: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
9fa0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9fb0: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
9fc0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
9fd0: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
9fe0: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
9ff0: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
a000: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
a010: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
a020: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
a030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a040: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
a050: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
a060: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
a070: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a080: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
a090: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
a0a0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
a0b0: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
a0c0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
a0d0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
a0e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
a0f0: 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  te;.  assert( db
a100: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
a110: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a120: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
a130: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
a140: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
a150: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
a160: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
a170: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
a180: 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  wNN(db, nByte );
a190: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
a1a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
a1b0: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
a1c0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
a1d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a1e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
a1f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a200: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
a210: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
a220: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
a230: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
a240: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
a250: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
a260: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
a270: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
a280: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
a290: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
a2a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a2b0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
a2c0: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
a2d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
a2e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
a2f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
a300: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
a310: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
a320: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
a330: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
a340: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
a350: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
a360: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
a370: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
a380: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
a390: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
a3a0: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
a3b0: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
a3c0: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
a3d0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
a3e0: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
a3f0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
a400: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
a410: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
a420: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
a430: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
a440: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
a450: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
a460: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
a470: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
a480: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
a490: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
a4a0: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
a4b0: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
a4c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
a4d0: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
a4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a4f0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
a500: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
a510: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
a520: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
a530: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
a540: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
a550: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
a560: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
a570: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
a580: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
a590: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
a5a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
a5b0: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
a5c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
a5d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a5e0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
a5f0: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
a600: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
a610: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
a620: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
a630: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
a640: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
a650: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
a660: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
a670: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
a680: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
a690: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
a6a0: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
a6b0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
a6c0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
a6d0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
a6e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
a6f0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
a700: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
a710: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
a720: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
a730: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a740: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
a750: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
a760: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
a770: 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  awNN(db, p->nId*
a780: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
a790: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
a7a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a7b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
a7c0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
a7d0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
a7e0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
a7f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
a800: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
a810: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
a820: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
a830: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
a840: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
a850: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
a860: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
a870: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
a880: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a890: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
a8a0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
a8b0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
a8c0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
a8d0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
a8e0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
a8f0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
a900: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
a910: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
a920: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
a930: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
a940: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
a950: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
a960: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
a970: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
a980: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
a990: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
a9a0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
a9b0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
a9c0: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
a9d0: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
a9e0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
a9f0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
aa00: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
aa10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
aa20: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
aa30: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
aa40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
aa50: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
aa60: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
aa70: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
aa80: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
aa90: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
aaa0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
aab0: 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  Src, flags);.  p
aac0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
aad0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
aae0: 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67   p->pWhere, flag
aaf0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  s);.  pNew->pGro
ab00: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
ab10: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
ab20: 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73  >pGroupBy, flags
ab30: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
ab40: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
ab50: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
ab60: 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  ng, flags);.  pN
ab70: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
ab80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
ab90: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
aba0: 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  y, flags);.  pNe
abb0: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
abc0: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
abd0: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
abe0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
abf0: 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b  >pPrior, flags);
ac00: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20  .  if( pPrior ) 
ac10: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
ac20: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e  pNew;.  pNew->pN
ac30: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
ac40: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
ac50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
ac60: 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a  pLimit, flags);.
ac70: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
ac80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ac90: 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  (db, p->pOffset,
aca0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
acb0: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
acc0: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
acd0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
ace0: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
acf0: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
ad00: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  eral;.  pNew->ad
ad10: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
ad20: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
ad30: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
ad40: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
ad50: 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63  tRow = p->nSelec
ad60: 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  tRow;.  pNew->pW
ad70: 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62  ith = withDup(db
ad80: 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73  , p->pWith);.  s
ad90: 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
ada0: 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65  ame(pNew, p->zSe
adb0: 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  lName);.  return
adc0: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
add0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
ade0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
adf0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
ae00: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
ae10: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
ae20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
ae30: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
ae40: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
ae50: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
ae60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
ae70: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
ae80: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
ae90: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
aea0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
aeb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
aec0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
aed0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
aee0: 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20   entire list is 
aef0: 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c  freed and.** NUL
af00: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  L is returned.  
af10: 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72  If non-NULL is r
af20: 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74  eturned, then it
af30: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
af40: 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65  * that the new e
af50: 6e 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73  ntry was success
af60: 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a  fully appended..
af70: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
af80: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
af90: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
afa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
afb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
afc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
afd0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
afe0: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
aff0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
b000: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
b010: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
b020: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
b030: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
b040: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
b050: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b060: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b070: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
b080: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
b090: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
b0a0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
b0b0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b0c0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
b0d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
b0e0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
b0f0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
b100: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
b110: 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   0;.    pList->a
b120: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b130: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b140: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
b150: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
b160: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
b170: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
b180: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
b190: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
b1a0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
b1b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b1c0: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
b1d0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
b1e0: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
b1f0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
b200: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
b210: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
b220: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
b230: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
b240: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
b250: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
b260: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
b270: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
b280: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
b290: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
b2a0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
b2b0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
b2c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
b2d0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
b2e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
b2f0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
b300: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
b310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
b320: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
b330: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
b340: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
b350: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
b360: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
b370: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
b380: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
b390: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
b3a0: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
b3b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
b3c0: 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  t the sort order
b3d0: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c   for the last el
b3e0: 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76  ement on the giv
b3f0: 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  en ExprList..*/.
b400: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
b410: 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
b420: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
b430: 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20  t iSortOrder){. 
b440: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b450: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51  rn;.  assert( SQ
b460: 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45  LITE_SO_UNDEFINE
b470: 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  D<0 && SQLITE_SO
b480: 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54  _ASC>=0 && SQLIT
b490: 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20  E_SO_DESC>0 );. 
b4a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70   assert( p->nExp
b4b0: 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f  r>0 );.  if( iSo
b4c0: 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20  rtOrder<0 ){.   
b4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d   assert( p->a[p-
b4e0: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
b4f0: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
b500: 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  SC );.    return
b510: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e  ;.  }.  p->a[p->
b520: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
b530: 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72  er = (u8)iSortOr
b540: 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  der;.}../*.** Se
b550: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
b560: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
b570: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b580: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
b590: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
b5a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
b5b0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
b5c0: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
b5d0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
b5e0: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
b5f0: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
b600: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
b610: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
b620: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
b630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
b640: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
b650: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
b660: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
b670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b680: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
b690: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b6a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
b6b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
b6c0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
b6d0: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
b6e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
b6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
b700: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
b710: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
b720: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b730: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
b740: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
b750: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
b760: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
b770: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
b780: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
b790: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
b7a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b7b0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
b7c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
b7d0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
b7e0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
b7f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
b800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
b810: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
b820: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
b830: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
b840: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
b850: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
b860: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
b870: 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65  uote ) sqlite3De
b880: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
b890: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
b8a0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
b8b0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
b8c0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
b8d0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
b8e0: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
b8f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
b900: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
b910: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
b920: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
b930: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
b940: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
b950: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
b960: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
b970: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
b980: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b990: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
b9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b9b0: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
b9c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b9d0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
b9e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b9f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
ba00: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
ba10: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
ba20: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
ba30: 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  .  ExprSpan *pSp
ba40: 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an         /* Th
ba50: 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64  e span to be add
ba60: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
ba70: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ba80: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
ba90: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
baa0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
bab0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
bac0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
bad0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
bae0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
baf0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
bb00: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
bb10: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
bb20: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
bb30: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65  ocFailed || pIte
bb40: 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d  m->pExpr==pSpan-
bb50: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
bb60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
bb70: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
bb80: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
bb90: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
bba0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
bbb0: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
bbf0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
bc00: 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rt));.  }.}../*.
bc10: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
bc20: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
bc30: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
bc40: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
bc50: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
bc60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
bc70: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
bc80: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
bc90: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
bca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
bcb0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
bcc0: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
bcd0: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
bce0: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
bcf0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
bd00: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
bd10: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
bd20: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
bd30: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
bd40: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
bd50: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
bd60: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
bd70: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
bd80: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
bd90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bda0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
bdb0: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
bdc0: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
bdd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
bde0: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
bdf0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  sion list..*/.st
be00: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
be10: 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69  LINE void exprLi
be20: 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  stDeleteNN(sqlit
be30: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
be40: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
be50: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
be60: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
be70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
be80: 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74  t->a!=0 || pList
be90: 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20  ->nExpr==0 );.  
bea0: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
beb0: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
bec0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
bed0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
bee0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
bef0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
bf00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
bf10: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
bf20: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
bf30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
bf40: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  m->zSpan);.  }. 
bf50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
bf60: 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
bf70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bf80: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64  , pList);.}.void
bf90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bfa0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
bfb0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
bfc0: 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
bfd0: 74 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65  t ) exprListDele
bfe0: 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  teNN(db, pList);
bff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c000: 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20   the bitwise-OR 
c010: 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67  of all Expr.flag
c020: 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  s fields in the 
c030: 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73  given.** ExprLis
c040: 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  t..*/.u32 sqlite
c050: 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63  3ExprListFlags(c
c060: 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70  onst ExprList *p
c070: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
c080: 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69    u32 m = 0;.  i
c090: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
c0a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
c0b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c0c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
c0d0: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
c0e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73  pExpr;.       as
c0f0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
c100: 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45  ;.       m |= pE
c110: 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  xpr->flags;.    
c120: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
c130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
c140: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
c150: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
c160: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
c170: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
c180: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
c190: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
c1a0: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
c1b0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
c1c0: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
c1d0: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
c1e0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
c1f0: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
c200: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
c210: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
c220: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
c230: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
c240: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
c250: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
c260: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
c270: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
c280: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
c290: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
c2a0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
c2b0: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
c2c0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
c2d0: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
c2e0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
c2f0: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
c300: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
c310: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
c320: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
c330: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
c340: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
c350: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
c360: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
c370: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
c380: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
c390: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
c3a0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
c3b0: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
c3c0: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
c3d0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
c3e0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
c3f0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
c400: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
c410: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
c420: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
c430: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
c440: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
c450: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
c460: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
c470: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
c480: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
c490: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
c4a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
c4b0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
c4c0: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
c4d0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
c4e0: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
c4f0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
c500: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
c510: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
c520: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
c530: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
c540: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
c550: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
c560: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
c570: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
c580: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
c590: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
c5a0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
c5b0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
c5c0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
c5d0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
c5e0: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
c5f0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
c600: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
c610: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
c620: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
c630: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
c640: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
c650: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
c660: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
c670: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
c680: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
c690: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
c6a0: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
c6b0: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
c6c0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
c6d0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
c6e0: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
c6f0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
c700: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
c710: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
c720: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
c730: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
c740: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
c750: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
c760: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
c770: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
c780: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
c790: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
c7a0: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
c7b0: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
c7c0: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
c7d0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
c7e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
c7f0: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
c800: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
c810: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
c820: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
c830: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
c840: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
c850: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
c860: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
c870: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
c880: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
c890: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
c8a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
c8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
c8c0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
c8d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c8e0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
c8f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
c900: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
c910: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
c920: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
c930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
c940: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
c950: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
c960: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
c970: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
c980: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
c990: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
c9a0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
c9b0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
c9c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c9d0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
c9e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
c9f0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ca00: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
ca10: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
ca20: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
ca30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
ca40: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
ca50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca60: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
ca70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
ca80: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ca90: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
caa0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
cab0: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
cac0: 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20  >eCode==5 ){.   
cad0: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
cae0: 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70   convert bound p
caf0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
cb00: 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20  ppear inside of 
cb10: 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a  CREATE.        *
cb20: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  * statements int
cb30: 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61  o a NULL when pa
cb40: 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  rsing the CREATE
cb50: 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20   statement text 
cb60: 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  out.        ** o
cb70: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
cb80: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
cb90: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
cba0: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
cbb0: 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65  }else if( pWalke
cbc0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20  r->eCode==4 ){. 
cbd0: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e         /* A boun
cbe0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61  d parameter in a
cbf0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
cc00: 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
cc10: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  s from.        *
cc20: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
cc30: 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72  e() causes an er
cc40: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ror */.        p
cc50: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
cc60: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
cc70: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
cc80: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
cc90: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
cca0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
ccb0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ccc0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
ccd0: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
cce0: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
ccf0: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
cd00: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
cd10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
cd20: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
cd30: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
cd40: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
cd50: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
cd60: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
cd70: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
cd80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
cd90: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
cda0: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
cdb0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
cdc0: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
cdd0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
cde0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
cdf0: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
ce00: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
ce10: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
ce20: 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
ce30: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
ce40: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
ce50: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
ce60: 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b  Code = initFlag;
ce70: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
ce80: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
ce90: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
cea0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
ceb0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
cec0: 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  ant;.  w.u.iCur 
ced0: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
cee0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
cef0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
cf00: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
cf10: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
cf20: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
cf30: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
cf40: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
cf50: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
cf60: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
cf70: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
cf80: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
cf90: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
cfa0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
cfb0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
cfc0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
cfd0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
cfe0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
cff0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
d000: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
d010: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
d020: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
d030: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
d040: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
d050: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
d060: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
d070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
d080: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
d090: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
d0a0: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
d0b0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
d0c0: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
d0d0: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
d0e0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
d0f0: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
d100: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
d110: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
d120: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
d130: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
d140: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
d150: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
d160: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d170: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
d180: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
d190: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
d1a0: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
d1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
d1c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
d1d0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
d1e0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
d1f0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
d200: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
d210: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
d220: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
d230: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
d240: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
d250: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
d260: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
d270: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
d280: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
d290: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
d2a0: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
d2b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
d2c0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
d2d0: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
d2e0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
d2f0: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
d300: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
d310: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
d320: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
d330: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
d340: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
d350: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
d360: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
d370: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
d380: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
d390: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
d3a0: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
d3b0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
d3c0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
d3d0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
d3e0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
d3f0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
d400: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
d410: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
d420: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
d430: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
d440: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
d450: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d460: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
d470: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
d480: 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20  , u8 isInit){.  
d490: 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d  assert( isInit==
d4a0: 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29  0 || isInit==1 )
d4b0: 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  ;.  return exprI
d4c0: 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e  sConst(p, 4+isIn
d4d0: 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65  it, 0);.}..#ifde
d4e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d4f0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
d500: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
d510: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
d520: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
d530: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
d540: 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
d550: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65  f some kind.  Re
d560: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
d570: 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65  are no subquerie
d580: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
d590: 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62  3ExprContainsSub
d5a0: 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a  query(Expr *p){.
d5b0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
d5c0: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
d5d0: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
d5e0: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
d5f0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
d600: 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
d610: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
d620: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
d630: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
d640: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
d650: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
d660: 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
d670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
d680: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
d690: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
d6a0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
d6b0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
d6c0: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
d6d0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
d6e0: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
d6f0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
d700: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
d710: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
d720: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
d730: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
d740: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
d750: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
d760: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
d770: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
d780: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
d790: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
d7a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
d7b0: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
d7c0: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
d7d0: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
d7e0: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
d7f0: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
d800: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
d810: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
d820: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
d830: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
d840: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
d850: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
d860: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
d870: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
d880: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
d890: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
d8a0: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
d8b0: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
d8c0: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
d8d0: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
d8e0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
d8f0: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
d900: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
d910: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
d920: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
d930: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
d940: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
d950: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d960: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
d970: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
d980: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
d990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d9a0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
d9b0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
d9c0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
d9d0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
d9e0: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
d9f0: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
da00: 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
da10: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
da20: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
da30: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
da40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
da50: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
da60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
da70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
da80: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
da90: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
daa0: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
dab0: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
dac0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
dad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
dae0: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
daf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
db00: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
db10: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
db20: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
db30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
db40: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
db50: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
db60: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
db70: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
db80: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
db90: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
dba0: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
dbb0: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
dbc0: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
dbd0: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
dbe0: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
dbf0: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
dc00: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
dc10: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
dc20: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
dc30: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
dc40: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
dc50: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
dc60: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
dc70: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
dc80: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
dc90: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
dca0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
dcb0: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
dcc0: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
dcd0: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
dce0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
dcf0: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
dd00: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
dd10: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
dd20: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
dd30: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
dd40: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
dd50: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
dd60: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
dd70: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
dd80: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
dd90: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
dda0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
ddb0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
ddc0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
ddd0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
dde0: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
ddf0: 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
de00: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
de10: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
de20: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  !=0 );.      ret
de30: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
de40: 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
de50: 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
de60: 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
de70: 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
de80: 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
de90: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
dea0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
deb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
dec0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
ded0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
dee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
def0: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
df00: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
df10: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
df20: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
df30: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
df40: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
df50: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
df60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
df70: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
df80: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
df90: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
dfa0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
dfb0: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
dfc0: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
dfd0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
dfe0: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
dff0: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
e000: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
e010: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
e020: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
e030: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e040: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
e050: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
e060: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
e070: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
e080: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
e090: 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
e0a0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
e0b0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
e0c0: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
e0d0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
e0e0: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
e0f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
e100: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
e110: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
e120: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
e130: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
e140: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
e150: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
e160: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
e170: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
e180: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
e190: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
e1a0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
e1b0: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
e1c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
e1d0: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
e1e0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
e1f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
e200: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
e210: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
e220: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
e230: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
e240: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
e250: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
e260: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
e270: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
e280: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
e290: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
e2a0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
e2b0: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
e2c0: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
e2d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
e2e0: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
e2f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
e300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
e310: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
e320: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
e330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e340: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
e350: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
e360: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
e370: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
e380: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
e390: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
e3a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
e3b0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
e3c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
e3d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e3e0: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
e3f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
e400: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e410: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
e420: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
e430: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58  n 0;.}../*.** pX
e440: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
e450: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
e460: 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43  If pX is a SELEC
e470: 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
e480: 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70  that can be simp
e490: 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65  lified to a dire
e4a0: 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c  ct table access,
e4b0: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
e4c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
e4d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e4e0: 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74  t.  If pX is not
e4f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
e500: 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  ent,.** or if th
e510: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e520: 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  nt needs to be m
e530: 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61  anifested into a
e540: 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61   transient.** ta
e550: 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ble, then return
e560: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65   NULL..*/.#ifnde
e570: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
e580: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65  BQUERY.static Se
e590: 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74  lect *isCandidat
e5a0: 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a  eForInOpt(Expr *
e5b0: 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  pX){.  Select *p
e5c0: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
e5d0: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
e5e0: 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
e5f0: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pTab;.  int i;. 
e600: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
e610: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
e620: 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e  Select) ) return
e630: 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75   0;  /* Not a su
e640: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
e650: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e660: 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pX, EP_VarSelect
e670: 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  )  ) return 0;  
e680: 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75  /* Correlated su
e690: 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e  bq */.  p = pX->
e6a0: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  x.pSelect;.  if(
e6b0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
e6c0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
e6d0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
e6e0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
e6f0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
e700: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
e710: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
e720: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
e730: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
e740: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
e750: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
e760: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
e770: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
e780: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
e790: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
e7a0: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
e7b0: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
e7c0: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
e7d0: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
e7e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
e7f0: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
e800: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
e810: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
e820: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
e830: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
e840: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
e850: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
e860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
e870: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
e880: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
e890: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8b0: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
e8c0: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
e8d0: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
e8e0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
e8f0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
e900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
e910: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
e920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
e930: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
e940: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
e950: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
e960: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
e970: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
e980: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
e990: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
e9a0: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
e9b0: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
e9c0: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
e9d0: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
e9e0: 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72  0].pTab;.  asser
e9f0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
ea00: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
ea10: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20  elect==0 );     
ea20: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
ea30: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76  lause is not a v
ea40: 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  iew */.  if( IsV
ea50: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
ea60: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ea70: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e  /* FROM clause n
ea80: 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
ea90: 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  le */.  pEList =
eaa0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
eab0: 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73  * All SELECT res
eac0: 75 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c  ults must be col
ead0: 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  umns. */.  for(i
eae0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
eaf0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
eb00: 78 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69  xpr *pRes = pELi
eb10: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
eb20: 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70      if( pRes->op
eb30: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
eb40: 74 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65  turn 0;.    asse
eb50: 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65  rt( pRes->iTable
eb60: 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ==pSrc->a[0].iCu
eb70: 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20  rsor );  /* Not 
eb80: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
eb90: 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72  query */.  }.  r
eba0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
ebb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ebc0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
ebd0: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f  .** Code an OP_O
ebe0: 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
ebf0: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  and allocate spa
ec00: 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e  ce for its flag.
ec10: 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20   Return the .** 
ec20: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
ec30: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
ec40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
ec50: 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50  deOnce(Parse *pP
ec60: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
ec70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ec80: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  e(pParse);      
ec90: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
eca0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
ecb0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
ecc0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ecd0: 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d  OP_Once, pParse-
ece0: 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 23 69  >nOnce++);.}..#i
ecf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ed00: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
ed10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ed20: 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  hat checks the l
ed30: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
ed40: 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69  of index table i
ed50: 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  Cur to see if.**
ed60: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79   it contains any
ed70: 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20   NULL entries.  
ed80: 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74  Cause the regist
ed90: 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c  er at regHasNull
eda0: 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f   to be set.** to
edb0: 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
edc0: 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69  e if iCur contai
edd0: 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61  ns no NULLs.  Ca
ede0: 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67  use register reg
edf0: 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65  HasNull.** to be
ee00: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20   set to NULL if 
ee10: 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  iCur contains on
ee20: 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
ee30: 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
ee40: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74   void sqlite3Set
ee50: 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65  HasNullFlag(Vdbe
ee60: 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69   *v, int iCur, i
ee70: 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a  nt regHasNull){.
ee80: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73    int addr1;.  s
ee90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
eea0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
eeb0: 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
eec0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
eed0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
eee0: 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b  P_Rewind, iCur);
eef0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ef00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
ef10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
ef20: 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67  mn, iCur, 0, reg
ef30: 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  HasNull);.  sqli
ef40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
ef50: 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  v, OPFLAG_TYPEOF
ef60: 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ARG);.  VdbeComm
ef70: 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65  ent((v, "first_e
ef80: 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43  ntry_in(%d)", iC
ef90: 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ur));.  sqlite3V
efa0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
efb0: 64 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ddr1);.}.#endif.
efc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
efd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
efe0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
eff0: 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  t is an IN opera
f000: 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20  tor with a list 
f010: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
f020: 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68   on the .** righ
f030: 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65  t-hand side.  Re
f040: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61  turn TRUE if tha
f050: 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61  t list is consta
f060: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
f070: 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  t sqlite3InRhsIs
f080: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
f090: 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48  In){.  Expr *pLH
f0a0: 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  S;.  int res;.  
f0b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
f0c0: 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50  Property(pIn, EP
f0d0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
f0e0: 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65   pLHS = pIn->pLe
f0f0: 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  ft;.  pIn->pLeft
f100: 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71   = 0;.  res = sq
f110: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
f120: 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d  ant(pIn);.  pIn-
f130: 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20  >pLeft = pLHS;. 
f140: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23   return res;.}.#
f150: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
f160: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
f170: 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d  ed by the implem
f180: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
f190: 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f  IN (...) operato
f1a0: 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72  r..** The pX par
f1b0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78  ameter is the ex
f1c0: 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20  pression on the 
f1d0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
f1e0: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a  erator, which.**
f1f0: 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72   might be either
f200: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
f210: 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71  ssions or a subq
f220: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
f230: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
f240: 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  ine is to find o
f250: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
f260: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61  e object that ca
f270: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74  n.** be used eit
f280: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
f290: 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68  membership in th
f2a0: 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20  e RHS set or to 
f2b0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
f2c0: 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  ** all members o
f2d0: 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73  f the RHS set, s
f2e0: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
f2f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73  es..**.** A curs
f300: 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  or is opened on 
f310: 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
f320: 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48  t that is the RH
f330: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
f340: 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e  ator.** and pX->
f350: 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
f360: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
f370: 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  at cursor..**.**
f380: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
f390: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
f3a0: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
f3b0: 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20  he b-tree type, 
f3c0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
f3d0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
f3e0: 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75  ID      - The cu
f3f0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
f400: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61  on a database ta
f410: 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
f420: 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20  EX_INDEX_ASC  - 
f430: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
f440: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65  pened on an asce
f450: 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
f460: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
f470: 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73  _DESC - The curs
f480: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
f490: 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
f4a0: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
f4b0: 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20  EX_EPH        - 
f4c0: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
f4d0: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
f4e0: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
f4f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f500: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
f510: 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
f520: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
f530: 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20  NDEX_NOOP       
f540: 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20  - No cursor was 
f550: 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20  allocated.  The 
f560: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
f570: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
f590: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
f5a0: 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70  sequence of comp
f5b0: 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41  arisons..**.** A
f5c0: 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65  n existing b-tre
f5d0: 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  e might be used 
f5e0: 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65  if the RHS expre
f5f0: 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69  ssion pX is a si
f600: 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79  mple.** subquery
f610: 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20   such as:.**.** 
f620: 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
f630: 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e  mn1>, <column2>.
f640: 2e 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  .. FROM <table>.
f650: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
f660: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
f670: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
f680: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
f690: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
f6a0: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
f6b0: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
f6c0: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
f6d0: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
f6e0: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
f6f0: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
f700: 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
f710: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
f720: 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
f730: 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
f740: 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
f750: 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
f760: 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f  in exactly one o
f770: 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
f780: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
f790: 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
f7a0: 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  OP.  If inFlags 
f7b0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
f7c0: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
f7d0: 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
f7e0: 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
f7f0: 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20  e used for a.** 
f800: 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20  fast membership 
f810: 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
f820: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
f830: 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a  t is set, the.**
f840: 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62   IN index will b
f850: 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
f860: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
f870: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
f880: 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  .** IN operator.
f890: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
f8a0: 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
f8b0: 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
f8c0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
f8d0: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
f8e0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
f8f0: 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
f900: 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
f910: 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
f920: 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
f930: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
f940: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
f950: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
f960: 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
f970: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
f980: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
f990: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
f9a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
f9b0: 72 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e  r due to.** a UN
f9c0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
f9d0: 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  or index..**.** 
f9e0: 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  When IN_INDEX_ME
f9f0: 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64  MBERSHIP is used
fa00: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
fa10: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
fa20: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
fa30: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29  embership tests)
fa40: 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d   then an epherem
fa50: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
fa60: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
fa70: 20 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20   <columns> is a 
fa80: 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50  single INTEGER P
fa90: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
faa0: 6e 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65  n or an .** inde
fab0: 78 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77  x can be found w
fac0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
fad0: 64 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69  d <columns> as i
fae0: 74 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a  ts left-most..**
faf0: 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
fb00: 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
fb10: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
fb20: 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
fb30: 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
fb40: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
fb50: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
fb60: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
fb70: 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
fb80: 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
fb90: 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
fba0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
fbb0: 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
fbc0: 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
fbd0: 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
fbe0: 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
fbf0: 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
fc00: 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
fc10: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
fc20: 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
fc30: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
fc40: 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
fc50: 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
fc60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
fc70: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
fc80: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
fc90: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
fca0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
fcb0: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
fcc0: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
fcd0: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
fce0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
fcf0: 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
fd00: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
fd10: 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
fd20: 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
fd30: 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
fd40: 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
fd50: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
fd60: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
fd70: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
fd80: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
fd90: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
fda0: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
fdb0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
fdc0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
fdd0: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
fde0: 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
fdf0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
fe00: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
fe10: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
fe20: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
fe30: 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
fe40: 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
fe50: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
fe60: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
fe70: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
fe80: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
fe90: 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
fea0: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
feb0: 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
fec0: 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
fed0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
fee0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
fef0: 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
ff00: 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
ff10: 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
ff20: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
ff30: 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
ff40: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
ff50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69  .**.** If the ai
ff60: 4d 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73  Map parameter is
ff70: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75   not NULL, it mu
ff80: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61  st point to an a
ff90: 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  rray containing.
ffa0: 2a 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66  ** one element f
ffb0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72  or each column r
ffc0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
ffd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
ffe0: 6f 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66  on the RHS.** of
fff0: 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65   the IN(...) ope
10000 72 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20  rator. The i'th 
10010 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72  entry of the arr
10020 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ay is populated 
10030 77 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73  with the.** offs
10040 65 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  et of the index 
10050 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63  column that matc
10060 68 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c  hes the i'th col
10070 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  umn returned by 
10080 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46  the.** SELECT. F
10090 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
100a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
100b0 64 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  d selected index
100c0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f   are:.**.**   (?
100d0 2c 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54  ,?,?) IN (SELECT
100e0 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31   a, b, c FROM t1
100f0 29 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  ).**   CREATE IN
10100 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20  DEX i1 ON t1(b, 
10110 63 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65  c, a);.**.** the
10120 6e 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70  n aiMap[] is pop
10130 75 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20  ulated with {2, 
10140 30 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65  0, 1}..*/.#ifnde
10150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10160 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
10170 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20  e3FindInIndex(. 
10180 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10190 0a 20 20 45 78 70 72 20 2a 70 58 2c 20 0a 20 20  .  Expr *pX, .  
101a0 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 0a 20 20  u32 inFlags, .  
101b0 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
101c0 6c 2c 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 0a  l,.  int *aiMap.
101d0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
10200 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
10210 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
10220 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
10230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10250 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
10260 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
10270 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
10280 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
10290 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
102a0 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
102b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
102c0 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102e0 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
102f0 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
10300 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
10310 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10320 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
10330 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
10340 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
10350 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
10360 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
10370 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
10380 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
10390 3d 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  =0;..  /* If the
103a0 20 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28   RHS of this IN(
103b0 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73  ...) operator is
103c0 20 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69   a SELECT, and i
103d0 66 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20  f it matters .  
103e0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
103f0 74 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  t the SELECT res
10400 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  ult contains NUL
10410 4c 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20  L values, check 
10420 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
10430 6e 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75  not NULL is actu
10440 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69  ally possible (i
10450 74 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f  t may not be, fo
10460 72 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a  r example, due .
10470 20 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c    ** to NOT NULL
10480 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
10490 74 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20  the schema). If 
104a0 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  no NULL values a
104b0 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a  re possible,.  *
104c0 2a 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75  * set prRhsHasNu
104d0 6c 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63  ll to 0 before c
104e0 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20  ontinuing.  */. 
104f0 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
10500 6c 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20  l && (pX->flags 
10510 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
10520 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
10530 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10540 73 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65  st = pX->x.pSele
10550 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
10560 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
10570 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10580 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10590 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
105a0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
105b0 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  r) ) break;.    
105c0 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c  }.    if( i==pEL
105d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
105e0 20 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c      prRhsHasNull
105f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10600 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
10610 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ee if an existin
10620 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
10630 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a   can be used to.
10640 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65    ** satisfy the
10650 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73   query.  This is
10660 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67   preferable to g
10670 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20  enerating a new 
10680 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20  .  ** ephemeral 
10690 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
106a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
106b0 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69   && (p = isCandi
106c0 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29  dateForInOpt(pX)
106d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
106e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
106f0 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
10700 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10710 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
10720 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
10750 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
10760 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10790 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
107a0 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
107b0 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45   *pEList = p->pE
107c0 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45  List;.    int nE
107d0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
107e0 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  xpr;..    assert
107f0 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
10800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10810 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
10820 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10830 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
10840 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
10850 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
10860 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
10870 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
10880 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
10890 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
108b0 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
108c0 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
108d0 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
108e0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
108f0 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64  Tab;..    /* Cod
10900 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74  e an OP_Transact
10910 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65  ion and OP_Table
10920 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e  Lock for <table>
10930 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  . */.    iDb = s
10940 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
10950 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
10960 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
10970 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
10980 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
10990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
109a0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
109b0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
109c0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
109d0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  ..    /* This fu
109e0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
109f0 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70  alled from two p
10a00 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63  laces. In both c
10a10 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20  ases the vdbe.  
10a20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
10a30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
10a40 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74   So assume sqlit
10a50 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61  e3GetVdbe() is a
10a60 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63  lways.    ** suc
10a70 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20  cessful here..  
10a80 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
10a90 76 29 3b 0a 20 20 20 20 69 66 28 20 6e 45 78 70  v);.    if( nExp
10aa0 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
10ab0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
10ac0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  umn<0 ){.      i
10ad0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
10ae0 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
10af0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
10b00 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
10b10 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
10b20 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
10b30 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
10b40 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  penRead);.      
10b50 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
10b60 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73  _ROWID;..      s
10b70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10b80 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
10b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
10ba0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
10bd0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
10be0 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f    int affinity_o
10bf0 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  k = 1;.      int
10c00 20 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   i;..      /* Ch
10c10 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
10c20 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
10c30 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
10c40 72 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  rm each .      *
10c50 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
10c60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
10c70 61 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68  affinity of each
10c80 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
10c90 20 20 2a 2a 20 69 74 20 6e 6f 74 2c 20 69 74 20    ** it not, it 
10ca0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
10cb0 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  to use any index
10cc0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
10cd0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
10ce0 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b  affinity_ok; i++
10cf0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
10d00 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 45  *pLhs = sqlite3E
10d10 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  xprVectorField(p
10d20 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
10d30 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
10d40 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
10d50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
10d60 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
10d70 66 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f = pTab->aCol[i
10d80 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  Col].affinity;. 
10d90 20 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61         char cmpa
10da0 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
10db0 61 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73  areAffinity(pLhs
10dc0 2c 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20  , idxaff);.     
10dd0 20 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66     switch( cmpaf
10de0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  f ){.          c
10df0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  ase SQLITE_AFF_B
10e00 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20  LOB:.           
10e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10e20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
10e30 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20  F_TEXT:.        
10e40 20 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20      affinity_ok 
10e50 3d 20 28 69 64 78 61 66 66 3d 3d 53 51 4c 49 54  = (idxaff==SQLIT
10e60 45 5f 41 46 46 5f 54 45 58 54 29 3b 0a 20 20 20  E_AFF_TEXT);.   
10e70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10e80 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
10e90 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  t:.            a
10ea0 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
10eb0 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
10ec0 69 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20  inity(idxaff);. 
10ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10ee0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
10ef0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
10f00 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
10f10 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
10f20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20  index is to.    
10f30 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
10f40 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
10f50 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
10f60 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
10f70 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
10f80 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
10f90 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20  equence.  */..  
10fa0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
10fb0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
10fc0 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
10fd0 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
10fe0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
10ff0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
11000 3e 6e 4b 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29  >nKeyCol<nExpr )
11010 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11020 20 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69     if( mustBeUni
11030 71 75 65 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b  que && (pIdx->nK
11040 65 79 43 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20  eyCol!=nExpr || 
11050 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70  !IsUniqueIndex(p
11060 49 64 78 29 29 20 29 7b 0a 20 20 20 20 20 20 20  Idx)) ){.       
11070 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11080 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
11090 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
110a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
110b0 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73    Expr *pLhs = s
110c0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
110d0 46 69 65 6c 64 28 70 58 2d 3e 70 4c 65 66 74 2c  Field(pX->pLeft,
110e0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45   i);.          E
110f0 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69  xpr *pRhs = pELi
11100 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
11110 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
11120 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65  q *pReq = sqlite
11130 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
11140 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
11150 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20  hs, pRhs);.     
11160 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20       int j;..   
11170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11180 52 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  Req || pParse->n
11190 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Err );.         
111a0 20 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62   if( pReq==0 ) b
111b0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20  reak;..         
111c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
111d0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
111e0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
111f0 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73  iColumn[j]!=pRhs
11200 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
11210 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
11220 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
11230 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20  azColl[j] );.   
11240 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
11250 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71  ite3StrICmp(pReq
11260 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
11270 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
11280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11290 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
112a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
112b0 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29    if( j==nExpr )
112c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
112d0 20 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69    if( aiMap ) ai
112e0 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  Map[i] = j;.    
112f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
11300 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20  f( i==nExpr ){. 
11310 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
11320 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
11330 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
11340 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11360 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11370 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
11380 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
11390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
113a0 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
113b0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
113c0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
113d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
113e0 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
113f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
11400 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
11410 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
11420 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
11430 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
11440 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
11450 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
11460 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
11470 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
11480 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20  rRhsHasNull ){. 
11490 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
114a0 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
114b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65  rse->nMem;.#ifde
114c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
114d0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
114e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34  .            i64
114f0 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70   mask = (1<<nExp
11500 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  r)-1;.          
11510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11520 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f  Op4Dup8(v, OP_Co
11530 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20  lumnsUsed, .    
11540 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
11550 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61  , 0, 0, (u8*)&ma
11560 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  sk, P4_INT64);.#
11570 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
11580 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29    if( nExpr==1 )
11590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
115a0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
115b0 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
115c0 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
115d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
115e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
115f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11600 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
11610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11630 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
11640 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
11650 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
11660 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
11670 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
11680 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
11690 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
116a0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
116b0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
116c0 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
116d0 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
116e0 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73   RHS is not cons
116f0 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20  tant or has two 
11700 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a  or fewer terms,.
11710 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20    ** then it is 
11720 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69  not worth creati
11730 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
11740 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74  table to evaluat
11750 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70  e.  ** the IN op
11760 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e  erator so return
11770 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a   IN_INDEX_NOOP..
11780 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
11790 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61  ==0.   && (inFla
117a0 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  gs & IN_INDEX_NO
117b0 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78  OP_OK).   && !Ex
117c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
117d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  , EP_xIsSelect).
117e0 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49     && (!sqlite3I
117f0 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70  nRhsIsConstant(p
11800 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73  X) || pX->x.pLis
11810 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29  t->nExpr<=2).  )
11820 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  {.    eType = IN
11830 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d  _INDEX_NOOP;.  }
11840 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
11850 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
11860 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
11870 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
11880 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
11890 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
118a0 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
118b0 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
118c0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
118d0 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
118e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
118f0 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
11900 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
11910 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
11920 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
11930 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
11940 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
11950 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
11960 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
11970 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
11980 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
11990 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
119a0 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
119b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
119c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
119d0 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
119e0 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
119f0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
11a00 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
11a10 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
11a20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
11a30 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
11a40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11a50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
11a60 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
11a70 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
11a80 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
11a90 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
11aa0 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
11ab0 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
11ac0 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
11ad0 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
11ae0 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20   = iTab;.  }..  
11af0 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79  if( aiMap && eTy
11b00 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe!=IN_INDEX_IND
11b10 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21  EX_ASC && eType!
11b20 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
11b30 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  DESC ){.    int 
11b40 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71  i, n;.    n = sq
11b50 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
11b60 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ize(pX->pLeft);.
11b70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11b80 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20  ; i++) aiMap[i] 
11b90 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
11ba0 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
11bb0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
11bc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11bd0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
11be0 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f  Expr is an (?, ?
11bf0 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70  ...) IN(...) exp
11c00 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a  ression. This .*
11c10 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
11c20 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
11c30 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
11c40 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
11c50 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69  ing .** the affi
11c60 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65  nities to be use
11c70 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  d for each colum
11c80 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  n of the compari
11c90 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  son..**.** It is
11ca0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
11cb0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
11cc0 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  r to ensure that
11cd0 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   the returned.**
11ce0 20 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74   string is event
11cf0 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
11d00 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
11d10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
11d20 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74  r *exprINAffinit
11d30 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
11d40 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
11d50 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
11d60 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
11d70 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
11d80 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
11d90 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74  pLeft);.  Select
11da0 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78   *pSelect = (pEx
11db0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
11dc0 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70  IsSelect) ? pExp
11dd0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30  r->x.pSelect : 0
11de0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
11df0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
11e00 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
11e10 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44   zRet = sqlite3D
11e20 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
11e30 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b  se->db, nVal+1);
11e40 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
11e50 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
11e60 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69  r(i=0; i<nVal; i
11e70 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
11e80 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70  *pA = sqlite3Exp
11e90 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 4c 65  rVectorField(pLe
11ea0 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68  ft, i);.      ch
11eb0 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78  ar a = sqlite3Ex
11ec0 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a  prAffinity(pA);.
11ed0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63        if( pSelec
11ee0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  t ){.        zRe
11ef0 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f  t[i] = sqlite3Co
11f00 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53  mpareAffinity(pS
11f10 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
11f20 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20  [i].pExpr, a);. 
11f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11f40 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b      zRet[i] = a;
11f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11f60 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20     zRet[nVal] = 
11f70 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75  '\0';.  }.  retu
11f80 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn zRet;.}.#endi
11f90 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
11fa0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11fb0 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50  /*.** Load the P
11fc0 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73  arse object pass
11fd0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
11fe0 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  argument with an
11ff0 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
12000 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ge of the form:.
12010 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c  **.**   "sub-sel
12020 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f  ect returns N co
12030 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64  lumns - expected
12040 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73   M".*/   .void s
12050 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
12060 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
12070 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c  se, int nActual,
12080 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20   int nExpect){. 
12090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
120a0 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20  t = "sub-select 
120b0 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d  returns %d colum
120c0 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64  ns - expected %d
120d0 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  ";.  sqlite3Erro
120e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d  rMsg(pParse, zFm
120f0 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70  t, nActual, nExp
12100 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ect);.}.#endif..
12110 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12120 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
12130 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
12140 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  s a subquery exp
12150 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c  ression, EXISTS,
12160 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74  .** or IN operat
12170 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
12180 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
12190 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
121a0 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
121b0 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
121c0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
121d0 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
121e0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
121f0 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
12200 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
12210 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
12220 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
12230 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
12240 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
12250 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
12260 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
12270 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
12280 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
12290 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
122a0 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
122b0 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
122c0 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
122d0 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
122e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
122f0 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
12300 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
12310 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
12320 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
12330 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
12340 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
12350 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
12360 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
12370 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
12380 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
12390 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
123a0 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
123b0 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
123c0 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
123d0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
123e0 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
123f0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
12400 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
12410 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
12420 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
12430 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65  *.** If rMayHave
12440 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Null is non-zero
12450 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
12460 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  t the operation 
12470 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74  is an IN.** (not
12480 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
12490 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68  STS) and that th
124a0 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74  e RHS might cont
124b0 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41  ains NULLs..** A
124c0 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
124d0 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69  does is initiali
124e0 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ze the register 
124f0 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76  given by rMayHav
12500 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c  eNull.** to NULL
12510 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69  .  Calling routi
12520 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61  nes will take ca
12530 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74  re of changing t
12540 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  his register.** 
12550 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c  value to non-NUL
12560 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  L if the RHS is 
12570 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a  NULL-free..**.**
12580 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72   For a SELECT or
12590 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
125a0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67  , return the reg
125b0 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73  ister that holds
125c0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20   the.** result. 
125d0 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72   For IN operator
125e0 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  s or if an error
125f0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74   occurs, the ret
12600 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a  urn value is 0..
12610 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12620 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12630 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53  int sqlite3CodeS
12640 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
12650 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12660 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
12670 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
12680 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
12690 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53      /* The IN, S
126a0 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53  ELECT, or EXISTS
126b0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
126c0 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c  nt rHasNullFlag,
126d0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
126e0 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  er that records 
126f0 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78  whether NULLs ex
12700 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20  ist in RHS */.  
12710 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20  int isRowid     
12720 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
12730 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70  ue, LHS of IN op
12740 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69  erator is a rowi
12750 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d  d */.){.  int jm
12760 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
12790 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
127a0 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30  /.  int rReg = 0
127b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
127d0 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20  egister storing 
127e0 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56  resulting */.  V
127f0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
12800 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12810 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
12820 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
12830 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12840 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a  ePush(pParse);..
12850 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
12860 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
12870 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
12880 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
12890 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
128a0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
128b0 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
128c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
128d0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
128e0 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
128f0 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
12900 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
12910 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
12920 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
12930 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
12940 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
12950 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
12960 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
12970 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
12980 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
12990 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
129a0 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
129b0 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
129c0 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
129d0 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
129e0 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
129f0 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
12a00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
12a10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
12a20 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
12a30 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79  ) ){.    jmpIfDy
12a40 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43  namic = sqlite3C
12a50 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
12a60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12a70 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
12a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12a90 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  IN.  if( pParse-
12aa0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
12ab0 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
12ac0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
12ad0 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
12ae0 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
12af0 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a  Y %d",.        j
12b00 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22  mpIfDynamic>=0?"
12b10 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
12b20 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
12b30 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
12b40 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20  :"SCALAR",.     
12b50 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74     pParse->iNext
12b60 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a  SelectId.    );.
12b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
12b90 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
12ba0 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
12bb0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
12bc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
12bd0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
12be0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
12bf0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
12c00 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
12c10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12c20 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
12c30 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
12c40 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
12c50 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
12c60 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
12c70 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
12c80 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
12c90 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
12ca0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
12cb0 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
12cc0 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b  .      int nVal;
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65     /* Size of ve
12cf0 63 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20  ctor pLeft */.  
12d00 20 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20      .      nVal 
12d10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
12d20 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a  torSize(pLeft);.
12d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69        assert( !i
12d40 73 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d  sRowid || nVal==
12d50 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  1 );..      /* W
12d60 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
12d70 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
12d80 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
12d90 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
12da0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
12db0 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
12dc0 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
12dd0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
12de0 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
12df0 6c 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20  lled with index 
12e00 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
12e10 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  g the results fr
12e20 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  om the .      **
12e30 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
12e40 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
12e50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
12e60 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
12e70 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
12e80 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
12e90 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
12ea0 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
12eb0 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
12ec0 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
12ed0 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
12ee0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
12ef0 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
12f00 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
12f10 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
12f20 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
12f30 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
12f40 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
12f50 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
12f60 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
12f70 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
12f80 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
12f90 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
12fa0 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
12fb0 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
12fc0 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
12fd0 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
12fe0 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
12ff0 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
13000 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
13010 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
13020 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
13030 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
13040 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13050 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13060 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13070 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
13080 2d 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77  ->iTable, (isRow
13090 69 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20  id?0:nVal));.   
130a0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
130b0 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
130c0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
130d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c  pParse->db, nVal
130e0 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
130f0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
13100 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
13110 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
13120 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
13130 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
13140 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
13150 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
13160 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
13170 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
13180 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
13190 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
131a0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
131b0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
131c0 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
131d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
131e0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
131f0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
13200 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  t;.        ExprL
13210 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53  ist *pEList = pS
13220 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
13230 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13240 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  !isRowid );.    
13250 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
13260 6e 45 78 70 72 21 3d 6e 56 61 6c 20 29 7b 0a 20  nExpr!=nVal ){. 
13270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13280 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
13290 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 6e  Parse, pEList->n
132a0 45 78 70 72 2c 20 6e 56 61 6c 29 3b 0a 20 20 20  Expr, nVal);.   
132b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
132c0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
132d0 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dest;.         
132e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
132f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13300 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
13310 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69  RT_Set, pExpr->i
13320 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
13330 20 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20    dest.zAffSdst 
13340 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
13350 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
13360 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13370 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
13380 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
13390 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
133a0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63            pSelec
133b0 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
133c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
133d0 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  e( pSelect->selF
133e0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
133f0 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
13400 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
13410 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
13420 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
13430 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
13440 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  () */.          
13450 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
13460 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
13470 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
13480 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13490 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
134a0 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
134b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
134c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
134d0 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
134e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
134f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
13500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13510 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
13520 64 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73  db, dest.zAffSds
13530 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
13540 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
13550 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
13560 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
13570 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
13580 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  ) */.          a
13590 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
135a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
135b0 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
135c0 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  xpr>0 );.       
135d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
135e0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
135f0 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
13600 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
13610 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
13620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
13630 78 70 72 20 2a 70 20 3d 20 28 6e 56 61 6c 3e 31  xpr *p = (nVal>1
13640 29 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 56  ) ? sqlite3ExprV
13650 65 63 74 6f 72 46 69 65 6c 64 28 70 4c 65 66 74  ectorField(pLeft
13660 2c 20 69 29 20 3a 20 70 4c 65 66 74 3b 0a 20 20  , i) : pLeft;.  
13670 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
13680 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  fo->aColl[i] = s
13690 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
136a0 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20  areCollSeq(.    
136b0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
136c0 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61  se, p, pEList->a
136d0 5b 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20  [i].pExpr.      
136e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
136f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
13700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
13710 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
13720 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
13730 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
13740 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
13750 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
13760 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
13770 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
13780 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
13790 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
137a0 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
137b0 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
137c0 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
137d0 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
137e0 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
137f0 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
13800 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
13810 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
13820 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
13830 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
13840 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
13850 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
13860 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
13870 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13880 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
13890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
138a0 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c  ffinity of the L
138b0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a  HS of the IN */.
138c0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
138d0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
138e0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
138f0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
13900 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13910 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
13920 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
13930 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61  , r3;..        a
13940 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
13950 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
13960 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  eft);.        if
13970 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
13980 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
13990 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
139a0 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  LOB;.        }. 
139b0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
139c0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
139d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
139e0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
139f0 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
13a00 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
13a10 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
13a20 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13a30 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
13a40 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
13a50 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
13a60 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
13a70 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
13a80 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
13a90 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
13aa0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
13ab0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
13ac0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13ad0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
13ae0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
13af0 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  d ) sqlite3VdbeA
13b00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
13b10 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
13b20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
13b30 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
13b40 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
13b50 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
13b60 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
13b70 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
13b80 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
13b90 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
13ba0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
13bb0 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
13bc0 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
13bd0 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
13be0 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
13bf0 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
13c00 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
13c10 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
13c20 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
13c30 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
13c40 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
13c50 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
13c60 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
13c70 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
13c80 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
13c90 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
13ca0 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
13cb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
13cc0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
13cd0 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
13ce0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
13cf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
13d00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13d10 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
13d20 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
13d30 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
13d40 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
13d50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
13d60 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
13d70 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
13d80 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
13d90 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
13da0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
13db0 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
13dc0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
13dd0 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
13de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
13df0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13e00 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
13e10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
13e20 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
13e30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
13e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
13e50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13e60 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
13e70 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
13e80 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
13e90 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
13ea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13eb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
13ec0 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13ef0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
13f00 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
13f10 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
13f20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
13f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13f40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
13f50 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
13f60 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
13f70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
13f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13fa0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
13fb0 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
13fc0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
13fd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13fe0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13ff0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
14000 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
14010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14030 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
14040 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
14050 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
14060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14070 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
14080 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
14090 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
140a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
140b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
140c0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
140d0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
140e0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
140f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14100 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
14110 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
14120 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
14130 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14140 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
14150 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
14160 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
14170 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
14180 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68      /* If this h
14190 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
141a0 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
141b0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
141c0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
141d0 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
141e0 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
141f0 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
14200 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
14210 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
14220 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
14230 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20    If this is an 
14240 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20  EXISTS, write.  
14250 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
14260 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
14270 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69   or 1 (exists) i
14280 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
14290 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  l.      ** and r
142a0 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72  ecord that memor
142b0 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
142c0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
142d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
14300 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
14310 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
14320 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
14350 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
14360 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
14370 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20  int nReg;       
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
143a0 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
143b0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
143c0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
143d0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
143e0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
143f0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
14400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14410 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
14420 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
14430 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
14440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
14450 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14460 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14470 63 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53  ct) );..      pS
14480 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
14490 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65  elect;.      nRe
144a0 67 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  g = pExpr->op==T
144b0 4b 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d  K_SELECT ? pSel-
144c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  >pEList->nExpr :
144d0 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
144e0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
144f0 26 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65  &dest, 0, pParse
14500 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20  ->nMem+1);.     
14510 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
14520 20 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28   nReg;.      if(
14530 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
14540 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
14550 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
14560 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64  T_Mem;.        d
14570 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74  est.iSdst = dest
14580 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
14590 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e    dest.nSdst = n
145a0 52 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Reg;.        sql
145b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
145c0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
145d0 73 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74  st.iSDParm, dest
145e0 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29  .iSDParm+nReg-1)
145f0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
14600 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
14610 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
14620 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
14630 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
14640 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
14650 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14660 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14670 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
14680 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
14690 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
146a0 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
146b0 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
146c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
146d0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
146e0 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
146f0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
14700 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
14710 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
14720 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
14730 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e        &sqlite3In
14760 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20  tTokens[1]);.   
14770 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20     pSel->iLimit 
14780 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  = 0;.      pSel-
14790 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
147a0 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20  _MultiValue;.   
147b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
147c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
147d0 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
147e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
147f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65       }.      rRe
14800 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  g = dest.iSDParm
14810 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56  ;.      ExprSetV
14820 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
14830 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
14840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14850 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48   }.  }..  if( rH
14860 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20  asNullFlag ){.  
14870 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
14880 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72  ullFlag(v, pExpr
14890 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75  ->iTable, rHasNu
148a0 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20  llFlag);.  }..  
148b0 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
148c0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
148d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
148e0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
148f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
14900 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
14910 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  e);..  return rR
14920 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
14930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14940 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
14950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
14960 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72  QUERY./*.** Expr
14970 20 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e   pIn is an IN(..
14980 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54  .) expression. T
14990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
149a0 63 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  cks that the .**
149b0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74   sub-select on t
149c0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
149d0 28 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20  () operator has 
149e0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
149f0 6f 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61  of .** columns a
14a00 73 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20  s the vector on 
14a10 74 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20  the LHS. Or, if 
14a20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
14a30 4e 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  N() is not .** a
14a40 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74   sub-query, that
14a50 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65   the LHS is a ve
14a60 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a  ctor of size 1..
14a70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
14a80 70 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20  prCheckIN(Parse 
14a90 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
14aa0 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74  In){.  int nVect
14ab0 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
14ac0 56 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e  VectorSize(pIn->
14ad0 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70  pLeft);.  if( (p
14ae0 49 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  In->flags & EP_x
14af0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
14b00 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49   if( nVector!=pI
14b10 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  n->x.pSelect->pE
14b20 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
14b30 20 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73       sqlite3Subs
14b40 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
14b50 65 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  e, pIn->x.pSelec
14b60 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
14b70 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20  , nVector);.    
14b80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
14b90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  }.  }else if( nV
14ba0 65 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20  ector!=1 ){.    
14bb0 69 66 28 20 28 70 49 6e 2d 3e 70 4c 65 66 74 2d  if( (pIn->pLeft-
14bc0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
14bd0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
14be0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
14bf0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 56  Error(pParse, nV
14c00 65 63 74 6f 72 2c 20 31 29 3b 0a 20 20 20 20 7d  ector, 1);.    }
14c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
14c20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14c30 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65  se, "invalid use
14c40 20 6f 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b   of row value");
14c50 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14c60 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
14c70 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
14c80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14c90 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
14ca0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14cb0 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73  for an IN expres
14cc0 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sion..**.**     
14cd0 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e   x IN (SELECT ..
14ce0 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  .).**      x IN 
14cf0 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e  (value, value, .
14d00 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ..).**.** The le
14d10 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48  ft-hand side (LH
14d20 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65  S) is a scalar e
14d30 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20  xpression.  The 
14d40 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
14d50 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61  (RHS).** is an a
14d60 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20  rray of zero or 
14d70 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68  more values.  Th
14d80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
14d90 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  true if the LHS 
14da0 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  is.** contained 
14db0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
14dc0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   The value of th
14dd0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
14de0 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a  unknown (NULL).*
14df0 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  * if the LHS is 
14e00 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c  NULL or if the L
14e10 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
14e20 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
14e30 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48  HS and the.** RH
14e40 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  S contains one o
14e50 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
14e60 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
14e70 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
14e80 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73   code that jumps
14e90 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20   to destIfFalse 
14ea0 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
14eb0 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20  t .** contained 
14ec0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20  within the RHS. 
14ed0 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73   If due to NULLs
14ee0 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
14ef0 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a  mine if the LHS.
14f00 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ** is contained 
14f10 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
14f20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75  jump to destIfNu
14f30 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  ll.  If the LHS 
14f40 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  is contained.** 
14f50 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74  within the RHS t
14f60 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
14f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14f80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14f90 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  IN(.  Parse *pPa
14fa0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
14fb0 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
14fc0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
14fd0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
14fe0 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  xpr,          /*
14ff0 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69   The IN expressi
15000 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  on */.  int dest
15010 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a  IfFalse,      /*
15020 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48   Jump here if LH
15030 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
15040 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f  ed in the RHS */
15050 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c  .  int destIfNul
15060 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  l        /* Jump
15070 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73   here if the res
15080 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e  ults are unknown
15090 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f   due to NULLs */
150a0 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61  .){.  int rRhsHa
150b0 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52  sNull = 0;  /* R
150c0 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20  egister that is 
150d0 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74  true if RHS cont
150e0 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
150f0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
15100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15110 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
15120 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20  /.  int r1;     
15130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
15140 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
15150 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ter */.  Vdbe *v
15160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15170 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
15180 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
15190 2f 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d  /.  int *aiMap =
151a0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70   0;       /* Map
151b0 20 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65   from vector fie
151c0 6c 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75  ld to index colu
151d0 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  mn */.  char *zA
151e0 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ff = 0;       /*
151f0 20 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   Affinity string
15200 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73   for comparisons
15210 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f   */.  int nVecto
15220 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  r;          /* S
15230 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66  ize of vectors f
15240 6f 72 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20  or this IN(...) 
15250 6f 70 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  op */.  Expr *pL
15260 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
15270 66 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ft;.  int i;..  
15280 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
15290 68 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70  heckIN(pParse, p
152a0 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
152b0 20 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41    zAff = exprINA
152c0 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
152d0 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 7a 41  pExpr);.  if( zA
152e0 66 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ff==0 ) return;.
152f0 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69    nVector = sqli
15300 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
15310 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
15320 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a  .  aiMap = (int*
15330 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
15340 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72  Zero(.      pPar
15350 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a  se->db, nVector*
15360 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
15370 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31  izeof(char)) + 1
15380 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 69 4d 61  .  );.  if( aiMa
15390 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
153a0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
153b0 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 20 20 20  ->db, zAff);.   
153c0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
153d0 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
153e0 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41  mpute the RHS. A
153f0 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
15400 69 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  if anything othe
15410 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49  r than.  ** IN_I
15420 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74  NDEX_NOOP is ret
15430 75 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65  urned, the table
15440 20 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73   opened ith curs
15450 6f 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  or pExpr->iTable
15460 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   .  ** contains 
15470 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
15480 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
15490 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f   If IN_INDEX_NOO
154a0 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20  P is returned,. 
154b0 20 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20   ** the RHS has 
154c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
154d0 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  ed.  */.  v = pP
154e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
154f0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
15500 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
15510 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
15520 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
15530 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15540 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
15550 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
15560 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
15570 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
15580 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
155b0 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
155c0 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155e0 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
155f0 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
15600 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c   : &rRhsHasNull,
15610 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65   aiMap);..  asse
15620 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
15630 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c   || nVector==1 |
15640 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  | eType==IN_INDE
15650 58 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20  X_EPH.       || 
15660 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
15670 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79  INDEX_ASC || eTy
15680 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
15690 45 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 0a 20  EX_DESC .  );.. 
156a0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
156b0 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
156c0 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
156d0 2e 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20  .)". If the LHS 
156e0 69 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f  is a .  ** vecto
156f0 72 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74  r, then it is st
15700 6f 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79  ored in an array
15710 20 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69   of nVector regi
15720 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a  sters starting .
15730 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2f    ** at r1..  */
15740 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
15750 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
15760 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  se, nVector);.  
15770 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15780 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
15790 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 26 26  if( nVector>1 &&
157a0 20 28 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26   (pLeft->flags &
157b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
157c0 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 65 6c  {.    int regSel
157d0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ect = sqlite3Cod
157e0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
157f0 65 2c 20 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b  e, pLeft, 0, 0);
15800 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15810 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
15820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15830 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
15840 79 2c 20 72 65 67 53 65 6c 65 63 74 2b 69 2c 20  y, regSelect+i, 
15850 72 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b  r1+aiMap[i], 0);
15860 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15870 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15880 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
15890 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d      Expr *pLhs =
158a0 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
158b0 6f 72 46 69 65 6c 64 28 70 4c 65 66 74 2c 20 69  orField(pLeft, i
158c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
158d0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
158e0 20 70 4c 68 73 2c 20 72 31 2b 61 69 4d 61 70 5b   pLhs, r1+aiMap[
158f0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i]);.    }.  }..
15900 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46    /* If sqlite3F
15910 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64  indInIndex() did
15920 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65   not find or cre
15930 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ate an index tha
15940 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  t is.  ** suitab
15950 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  le for evaluatin
15960 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
15970 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  r, then evaluate
15980 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65   using a.  ** se
15990 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
159a0 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  isons..  */.  if
159b0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
159c0 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
159d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
159e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
159f0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
15a00 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
15a10 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
15a20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
15a30 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
15a40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15a50 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
15a60 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
15a70 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
15a80 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
15a90 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
15aa0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15ab0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
15ac0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
15ad0 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
15ae0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
15af0 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
15b00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15b10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
15b20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15b30 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
15b40 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c  1, r1, regCkNull
15b50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
15b60 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
15b70 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
15b80 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
15b90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15ba0 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
15bb0 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
15bc0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
15bd0 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
15be0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
15bf0 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
15c00 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
15c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15c20 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
15c30 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
15c40 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
15c50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
15c60 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
15c70 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
15c80 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
15c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15ca0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
15cb0 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20  q, r1, labelOk, 
15cc0 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
15ce0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
15cf0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
15d00 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
15d10 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
15d20 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
15d30 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
15d40 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
15d50 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
15d60 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15d70 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
15d80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15d90 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
15da0 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
15db0 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
15dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15dd0 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64  (v, OP_Ne, r1, d
15de0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
15e10 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
15e20 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
15e30 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
15e40 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15e50 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
15e60 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15e70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15e80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15e90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15ea0 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
15eb0 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
15ec0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
15ed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ee0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
15ef0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
15f00 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
15f10 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15f20 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
15f30 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
15f40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
15f50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15f60 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
15f70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15f80 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
15f90 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  CkNull);.  }else
15fa0 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61  {.  .    /* If a
15fb0 6e 79 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20  ny value on the 
15fc0 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  LHS is NULL, the
15fd0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49   result of the I
15fe0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a  N(...) operator.
15ff0 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65      ** must be e
16000 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e  ither false or N
16010 55 4c 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77  ULL. If these tw
16020 6f 20 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64  o are handled id
16030 65 6e 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a  entically,.    *
16040 2a 20 74 65 73 74 20 74 68 65 20 4c 48 53 20 66  * test the LHS f
16050 6f 72 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d  or NULLs and jum
16060 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65  p directly to de
16070 73 74 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20  stIfNull if any 
16080 61 72 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64  are.    ** found
16090 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
160a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e   Otherwise, if N
160b0 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72  ULL and false ar
160c0 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
160d0 65 6e 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20  ently, and the. 
160e0 20 20 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70     ** IN(...) op
160f0 65 72 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  eration is not a
16100 20 76 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f   vector operatio
16110 6e 2c 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f  n, and the LHS o
16120 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65  f the.    ** ope
16130 72 61 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74  rator is NULL, t
16140 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
16150 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 69  s false if the i
16160 6e 64 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20  ndex is .    ** 
16170 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
16180 2c 20 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77  , or NULL otherw
16190 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ise.  */.    if(
161a0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
161b0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
161c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
161d0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
161e0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
161f0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 46  lite3ExprVectorF
16200 69 65 6c 64 28 70 45 78 70 72 2d 3e 70 4c 65 66  ield(pExpr->pLef
16210 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  t, i);.        i
16220 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
16230 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20  nBeNull(p) ){.  
16240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16260 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70  IsNull, r1+aiMap
16270 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  [i], destIfNull)
16280 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
16290 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
162a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
162b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65     }else if( nVe
162c0 63 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69 74  ctor==1 && sqlit
162d0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
162e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b  pExpr->pLeft) ){
162f0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
16300 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16310 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
16320 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76  ll, r1); VdbeCov
16330 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
16340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16350 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
16360 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
16370 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
16380 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
16390 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
163a0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
163b0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
163c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
163d0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
163e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
163f0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
16400 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  ROWID ){.      /
16410 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
16420 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
16430 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
16440 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  tree */.      sq
16450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16460 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
16470 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
16480 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29  destIfFalse, r1)
16490 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
164a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
164b0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
164c0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
164d0 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62  HS is an index b
164e0 2d 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68 65  -tree. Apply the
164f0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
16500 20 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73 20    ** affinities 
16510 74 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f 6e  to each value on
16520 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
16530 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20  operator.  */.  
16540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16550 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
16560 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74 6f  nity, r1, nVecto
16570 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63  r, 0, zAff, nVec
16580 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  tor);.      .   
16590 20 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31     if( nVector>1
165a0 20 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   && destIfNull!=
165b0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
165c0 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20         int iIdx 
165d0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
165e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
165f0 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  r;.        int a
16600 64 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20  ddrNext;..      
16610 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
16620 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
16630 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  y. */.        ad
16640 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16650 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
16660 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20  Found, iIdx, 0, 
16670 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20  r1, nVector);.  
16680 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16690 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20  ge(v);..        
166a0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
166b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b   the specified k
166c0 65 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  ey is not presen
166d0 74 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  t in the index, 
166e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  .        ** so t
166f0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
16700 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f 72   IN(..) operator
16710 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
16720 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20 20  NULL or.        
16730 2a 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20 63  ** 0. The vdbe c
16740 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
16750 6c 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74 20  low figures out 
16760 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20 20  which.  */.     
16770 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31 2b     addrNext = 1+
16780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16790 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
167a0 69 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c 73  iIdx, destIfFals
167b0 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  e);.        Vdbe
167c0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
167d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
167e0 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
167f0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
16800 70 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  p;.          Col
16810 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
16820 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
16830 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16840 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16850 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
16860 45 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28  ExprVectorField(
16870 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
16880 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
16890 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
168a0 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 20  pParse, p);..   
168b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
168c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
168d0 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c 20 69 2c 20  olumn, iIdx, i, 
168e0 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  r2);.          s
168f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16900 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2b 69 2c  (v, OP_Eq, r1+i,
16910 20 30 2c 20 72 32 2c 20 28 76 6f 69 64 2a 29 70   0, r2, (void*)p
16920 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c 53 45 51 29  Coll,P4_COLLSEQ)
16930 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16940 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
16950 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  v, SQLITE_JUMPIF
16960 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
16970 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16980 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16990 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
169a0 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 2c 20   OP_Next, iIdx, 
169b0 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
169c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
169d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
169e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
169f0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
16a00 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
16a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16a20 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16a30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16a40 6e 74 41 64 64 72 28 76 29 2d 33 29 3b 0a 20 20  ntAddr(v)-3);.  
16a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16a60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16a70 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
16a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
16a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16aa0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
16ab0 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  stIfNull);..    
16ac0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 77      /* The key w
16ad0 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  as found in the 
16ae0 69 6e 64 65 78 2e 20 49 66 20 69 74 20 63 6f 6e  index. If it con
16af0 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 76  tains any NULL v
16b00 61 6c 75 65 73 2c 0a 20 20 20 20 20 20 20 20 2a  alues,.        *
16b10 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
16b20 74 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29  t of the IN(...)
16b30 20 6f 70 65 72 61 74 6f 72 20 69 73 20 4e 55 4c   operator is NUL
16b40 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  L. Otherwise, th
16b50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73  e.        ** res
16b60 75 6c 74 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ult is 1.  */.  
16b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16b80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
16b90 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
16ba0 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20  i=0; i<nVector; 
16bb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
16bc0 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
16bd0 33 45 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64  3ExprVectorField
16be0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
16bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16c00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
16c10 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20  eNull(p) ){.    
16c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16c30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16c40 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70  IsNull, r1+aiMap
16c50 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  [i], destIfNull)
16c60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
16c70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16c80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16c90 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73     }..      }els
16ca0 65 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c  e if( rRhsHasNul
16cb0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
16cc0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
16cd0 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f  uns if it is kno
16ce0 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  wn at compile ti
16cf0 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a  me that the RHS.
16d00 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f          ** canno
16d10 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76  t contain NULL v
16d20 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
16d30 65 6e 73 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ens as a result.
16d40 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 22 4e          ** of "N
16d50 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
16d60 69 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ints in the data
16d70 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
16d80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16d90 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73  ** Also run this
16da0 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20   branch if NULL 
16db0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
16dc0 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a   FALSE.        *
16dd0 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69  * for this parti
16de0 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f  cular IN operato
16df0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  r.  */.        s
16e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16e10 49 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  Int(.           
16e20 20 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c   v, OP_NotFound,
16e30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
16e40 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
16e50 20 6e 56 65 63 74 6f 72 0a 20 20 20 20 20 20 20   nVector.       
16e60 20 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65   );.        Vdbe
16e70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e90 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61    /* In this bra
16ea0 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20  nch, the RHS of 
16eb0 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e  the IN might con
16ec0 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a  tain a NULL and.
16ed0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
16ee0 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c  resence of a NUL
16ef0 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b  L on the RHS mak
16f00 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20  es a difference 
16f10 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  in the.        *
16f20 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20  * outcome..     
16f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
16f40 74 20 61 64 64 72 31 3b 0a 0a 20 20 20 20 20 20  t addr1;..      
16f50 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
16f60 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
16f70 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
16f80 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
16f90 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
16fa0 68 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69  hen the answer i
16fb0 73 20 54 52 55 45 20 74 68 65 20 70 72 65 73 65  s TRUE the prese
16fc0 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
16fd0 74 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20  the RHS does.   
16fe0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74       ** not matt
16ff0 65 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  er.  If the LHS 
17000 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
17010 20 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65   in the RHS, the
17020 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
17030 20 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20   answer is NULL 
17040 69 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61  if the RHS conta
17050 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68  ins NULLs and th
17060 65 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20  e answer is.    
17070 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
17080 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
17090 66 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  free..        */
170a0 0a 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d  .        addr1 =
170b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
170c0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
170d0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
170e0 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  , 0, r1, 1);.   
170f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
17100 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
17110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17120 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52  v, OP_IsNull, rR
17130 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
17140 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
17150 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17170 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
17180 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
17190 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
171a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
171b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
171c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
171d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
171e0 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  e, r1);.  sqlite
171f0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
17200 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
17210 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
17220 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c  b, aiMap);.  sql
17230 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
17240 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 20 20  e->db, zAff);.  
17250 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
17260 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
17270 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
17280 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17290 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
172a0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
172b0 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
172c0 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
172d0 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
172e0 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
172f0 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
17300 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
17310 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
17320 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
17330 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
17340 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
17350 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
17360 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
17370 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
17380 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
17390 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
173a0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
173b0 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
173c0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
173d0 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
173e0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
173f0 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
17400 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
17410 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
17420 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
17430 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
17440 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
17450 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
17460 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
17470 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
17480 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
17490 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
174a0 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
174b0 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
174c0 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
174d0 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
174e0 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
174f0 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
17500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
17510 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
17520 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
17530 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
17540 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
17550 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
17560 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
17570 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
17580 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
17590 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
175a0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
175b0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
175c0 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
175d0 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
175e0 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
175f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
17600 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
17610 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
17620 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
17630 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
17640 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17650 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17660 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
17670 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
17680 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
17690 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
176a0 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
176b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
176c0 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
176d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
176f0 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
17700 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
17710 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
17720 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17730 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
17740 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
17750 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
17760 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
17770 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
17780 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c  .    if( c==0 ||
17790 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61   (c==2 && negFla
177a0 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
177b0 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
177c0 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45   = c==2 ? SMALLE
177d0 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
177e0 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
177f0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
17800 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
17810 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
17820 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
17830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
17840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17850 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
17860 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17870 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
17880 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
17890 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
178a0 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
178b0 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  #else.#ifndef SQ
178c0 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e  LITE_OMIT_HEX_IN
178d0 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20  TEGER.      if( 
178e0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
178f0 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b  (z,"0x",2)==0 ){
17900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17910 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17920 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f   "hex literal to
17930 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a  o big: %s", z);.
17940 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
17950 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
17960 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
17970 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
17980 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
17990 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
179a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
179b0 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65  _DEBUG)./*.** Ve
179c0 72 69 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74  rify the consist
179d0 65 6e 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  ency of the colu
179e0 6d 6e 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74  mn cache.*/.stat
179f0 69 63 20 69 6e 74 20 63 61 63 68 65 49 73 56 61  ic int cacheIsVa
17a00 6c 69 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  lid(Parse *pPars
17a10 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
17a20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53    for(i=n=0; i<S
17a30 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
17a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
17a50 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
17a60 65 5b 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b  e[i].iReg>0 ) n+
17a70 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
17a80 6e 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  n==pParse->nColC
17a90 61 63 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ache;.}.#endif..
17aa0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61  /*.** Clear a ca
17ab0 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  che entry..*/.st
17ac0 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45  atic void cacheE
17ad0 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20  ntryClear(Parse 
17ae0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
17af0 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20  yColCache *p){. 
17b00 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20   if( p->tempReg 
17b10 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
17b20 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
17b30 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
17b40 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
17b50 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
17b60 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
17b70 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b  eg++] = p->iReg;
17b80 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65  .    }.    p->te
17b90 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  mpReg = 0;.  }. 
17ba0 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
17bb0 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
17bc0 65 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e--;.  assert( p
17bd0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17be0 63 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65  cFailed || cache
17bf0 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
17c00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  );.}.../*.** Rec
17c10 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
17c20 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
17c30 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
17c40 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
17c50 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
17c60 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
17c70 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
17c80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
17c90 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
17ca0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
17cb0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
17cc0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
17cd0 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
17ce0 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
17cf0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
17d00 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
17d10 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
17d20 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
17d30 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
17d40 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
17d50 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
17d60 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
17d70 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
17d80 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
17d90 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
17da0 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
17db0 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
17dc0 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
17dd0 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
17de0 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
17df0 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
17e00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
17e10 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
17e20 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
17e30 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
17e40 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
17e50 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
17e60 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
17e70 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
17e80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
17e90 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
17ea0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
17eb0 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
17ec0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
17ed0 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
17ee0 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
17ef0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
17f00 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
17f10 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
17f20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
17f30 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
17f40 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
17f50 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
17f60 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
17f70 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
17f80 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
17f90 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
17fa0 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
17fb0 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
17fc0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
17fd0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
17fe0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
17ff0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
18000 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c  rt( p->iReg==0 |
18010 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  | p->iTable!=iTa
18020 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21  b || p->iColumn!
18030 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  =iCol );.  }.#en
18040 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61  dif..  /* Find a
18050 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
18060 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
18070 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
18080 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
18090 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
180a0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
180b0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
180c0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
180d0 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
180e0 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
180f0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
18100 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
18110 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
18120 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
18130 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  g;.      p->temp
18140 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Reg = 0;.      p
18150 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
18160 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
18170 20 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43     pParse->nColC
18180 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73  ache++;.      as
18190 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
181a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
181b0 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
181c0 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 20 20  Parse) );.      
181d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
181e0 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
181f0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
18200 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
18210 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
18220 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
18230 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
18240 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
18250 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
18260 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
18270 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
18280 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
18290 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
182a0 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
182b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
182c0 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
182d0 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
182e0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
182f0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
18300 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
18310 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
18320 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
18330 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
18340 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
18350 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
18360 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
18370 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
18380 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
18390 43 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Cnt++;.    asser
183a0 74 28 20 63 61 63 68 65 49 73 56 61 6c 69 64 28  t( cacheIsValid(
183b0 70 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 72  pParse) );.    r
183c0 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
183d0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
183e0 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
183f0 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
18400 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
18410 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
18420 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
18430 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
18440 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
18450 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
18460 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
18470 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
18480 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
18490 6e 52 65 67 29 7b 0a 20 20 73 74 72 75 63 74 20  nReg){.  struct 
184a0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
184b0 69 66 28 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70  if( iReg<=0 || p
184c0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
184d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
184e0 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
184f0 6c 43 61 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f  lCache[SQLITE_N_
18500 43 4f 4c 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77  COLCACHE-1];.  w
18510 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28  hile(1){.    if(
18520 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67   p->iReg >= iReg
18530 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52   && p->iReg < iR
18540 65 67 2b 6e 52 65 67 20 29 20 63 61 63 68 65 45  eg+nReg ) cacheE
18550 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
18560 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  , p);.    if( p=
18570 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
18580 68 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  he ) break;.    
18590 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
185a0 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
185b0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
185c0 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
185d0 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
185e0 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
185f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
18600 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
18610 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
18620 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
18630 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
18640 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
18650 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
18660 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18670 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
18680 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
18690 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
186a0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
186b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
186c0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
186d0 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
186e0 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
186f0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
18700 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
18710 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
18720 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
18730 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
18740 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
18750 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
18760 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
18770 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
18780 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
18790 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
187a0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
187b0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
187c0 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
187d0 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
187e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
187f0 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
18800 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
18810 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
18820 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
18830 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
18840 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b  CacheLevel>=1 );
18850 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
18860 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66  eLevel--;.#ifdef
18870 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
18880 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
18890 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
188a0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
188b0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50  .    printf("POP
188c0 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72    to %d\n", pPar
188d0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
188e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
188f0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
18900 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
18910 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
18920 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
18930 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
18940 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
18950 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
18960 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
18970 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
18980 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
18990 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
189a0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
189b0 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
189c0 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
189d0 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
189e0 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
189f0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
18a00 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
18a10 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
18a20 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
18a30 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
18a40 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
18a50 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
18a60 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
18a70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18a80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
18a90 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
18aa0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
18ab0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
18ac0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
18ad0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
18ae0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
18af0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
18b00 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
18b10 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
18b20 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
18b30 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
18b40 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
18b50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18b60 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20   that will load 
18b70 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
18b80 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61  gOut a value tha
18b90 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  t is.** appropri
18ba0 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78  ate for the iIdx
18bb0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
18bc0 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
18bd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
18be0 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
18bf0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
18c00 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61  arse,  /* The pa
18c10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18c20 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
18c30 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18c40 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20  whose column is 
18c50 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
18c60 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
18c70 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
18c80 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
18c90 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  row */.  int iId
18ca0 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20  xCol,    /* The 
18cb0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
18cc0 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  dex to be loaded
18cd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
18ce0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
18cf0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
18d00 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
18d10 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
18d20 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64  16 iTabCol = pId
18d30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78  x->aiColumn[iIdx
18d40 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62  Col];.  if( iTab
18d50 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  Col==XN_EXPR ){.
18d60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
18d70 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20  ->aColExpr );.  
18d80 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
18d90 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e  aColExpr->nExpr>
18da0 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70  iIdxCol );.    p
18db0 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
18dc0 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73  = iTabCur;.    s
18dd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
18de0 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
18df0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64  >aColExpr->a[iId
18e00 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67  xCol].pExpr, reg
18e10 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
18e20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
18e30 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
18e40 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
18e50 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
18e60 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
18e90 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
18ea0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
18eb0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
18ec0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
18ed0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
18ee0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
18ef0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18f00 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
18f10 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
18f20 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
18f30 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
18f40 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
18f50 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
18f60 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
18f70 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
18f80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
18f90 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
18fa0 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
18fb0 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
18fc0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
18fd0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
18fe0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
18ff0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
19000 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
19010 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
19020 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
19030 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
19040 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
19050 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
19060 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
19070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19080 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
19090 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
190a0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
190b0 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
190c0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
190d0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
190e0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
190f0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
19100 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
19110 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
19120 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
19130 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
19140 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
19150 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
19160 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
19170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19180 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
19190 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
191a0 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
191b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
191c0 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
191d0 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
191e0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
191f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19200 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
19210 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
19220 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
19230 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
19240 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
19250 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
19260 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e  ister. .**.** An
19270 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
19280 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
19290 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
192a0 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69  ister iReg.  Thi
192b0 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61  s.** is not gara
192c0 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f  nteeed for GetCo
192d0 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73  lumn() - the res
192e0 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ult can be store
192f0 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69  d in.** any regi
19300 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72  ster.  But the r
19310 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
19320 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72  eed to land in r
19330 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20  egister iReg.** 
19340 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  for GetColumnToR
19350 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  eg()..**.** Ther
19360 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
19370 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
19380 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
19390 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
193a0 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
193b0 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
193c0 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
193d0 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
193e0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
193f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
19400 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
19410 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
19420 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
19430 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
19440 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
19450 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
19460 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
19470 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
19480 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
19490 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
194a0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
194b0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
194c0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
194d0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
194e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
194f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
19500 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
19510 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
19520 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
19530 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
19540 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
19550 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
19560 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19570 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
19580 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
19590 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
195a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
195b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
195c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
195d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
195e0 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
195f0 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
19600 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
19610 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
19620 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
19630 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
19640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19650 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
19660 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
19670 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
19680 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
19690 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
196a0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
196b0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
196c0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
196d0 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
196e0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
196f0 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
19700 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19710 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
19720 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
19730 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
19740 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
19750 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
19760 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
19770 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
19780 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
19790 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20  nToReg(.  Parse 
197a0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
197b0 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
197c0 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
197d0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
197e0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
197f0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
19800 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
19810 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
19820 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
19830 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
19840 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
19850 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
19860 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
19870 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
19880 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
19890 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg         /* St
198a0 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
198b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20   */.){.  int r1 
198c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
198d0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
198e0 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  e, pTab, iColumn
198f0 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20  , iTable, iReg, 
19900 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52  0);.  if( r1!=iR
19910 65 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  eg ) sqlite3Vdbe
19920 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
19930 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
19940 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f  r1, iReg);.}.../
19950 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
19960 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
19970 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
19980 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
19990 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
199a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
199b0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
199c0 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  p;..#if SQLITE_D
199d0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
199e0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
199f0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
19a00 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
19a10 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
19a20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
19a30 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
19a40 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
19a50 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
19a60 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
19a70 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
19a80 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
19a90 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
19aa0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
19ab0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
19ac0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
19ad0 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
19ae0 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
19af0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
19b00 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
19b10 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
19b20 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19b30 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
19b40 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
19b50 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
19b60 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
19b70 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
19b80 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
19b90 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
19ba0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
19bb0 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
19bc0 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
19bd0 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
19be0 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
19bf0 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
19c00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
19c10 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
19c20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
19c30 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
19c40 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
19c50 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
19c60 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
19c70 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
19c80 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
19c90 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
19ca0 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
19cb0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
19cc0 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
19cd0 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
19ce0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
19cf0 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
19d00 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
19d10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
19d20 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
19d30 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
19d40 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
19d50 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
19d60 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
19d70 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
19d80 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
19d90 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
19da0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
19db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19dc0 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
19dd0 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
19de0 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
19df0 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
19e00 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
19e10 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
19e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19e30 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
19e40 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
19e50 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
19e60 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
19e70 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
19e80 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
19e90 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
19ea0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
19eb0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
19ec0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
19ed0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
19ee0 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
19ef0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
19f00 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
19f10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19f20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
19f30 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
19f40 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
19f50 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  T */.../*.** Con
19f60 76 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69  vert an expressi
19f70 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
19f80 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74  REGISTER.*/.stat
19f90 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
19fa0 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
19fb0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
19fc0 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
19fd0 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
19fe0 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
19ff0 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1a000 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1a010 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 73 74 61 74  P_Skip);.}..stat
1a020 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
1a030 42 65 74 77 65 65 6e 28 50 61 72 73 65 2a 2c 45  Between(Parse*,E
1a040 78 70 72 2a 2c 69 6e 74 2c 76 6f 69 64 28 2a 29  xpr*,int,void(*)
1a050 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
1a060 74 2c 69 6e 74 29 2c 69 6e 74 29 3b 0a 0a 2f 2a  t,int),int);../*
1a070 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1a080 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
1a090 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
1a0a0 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
1a0b0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
1a0c0 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
1a0d0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
1a0e0 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
1a0f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1a100 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
1a110 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1a120 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
1a130 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
1a140 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
1a150 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
1a160 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
1a170 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
1a180 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
1a190 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
1a1a0 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
1a1b0 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
1a1c0 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
1a1d0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1a1e0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
1a1f0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
1a200 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
1a210 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
1a220 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
1a230 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1a240 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1a250 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a260 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1a270 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1a280 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a290 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
1a2a0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1a2b0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
1a2e0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1a2f0 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
1a300 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
1a310 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
1a320 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
1a330 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
1a340 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1a350 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1a360 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1a370 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1a380 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1a390 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
1a3a0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
1a3b0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
1a3c0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
1a3d0 2c 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  , r2;           
1a3e0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
1a3f0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
1a400 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1a410 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
1a420 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1a430 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1a440 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
1a450 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
1a460 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
1a470 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   node */.  int p
1a480 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  5 = 0;..  assert
1a490 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
1a4a0 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
1a4b0 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
1a4c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a4d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1a4e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1a4f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1a500 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1a510 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
1a520 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
1a530 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1a540 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
1a550 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1a560 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
1a570 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
1a580 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
1a590 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
1a5a0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1a5b0 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
1a5c0 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
1a5d0 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
1a5e0 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
1a5f0 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
1a600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
1a610 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
1a620 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
1a630 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
1a640 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
1a650 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
1a660 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
1a670 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a680 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a690 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
1a6a0 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
1a6b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1a6e0 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
1a6f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a700 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
1a710 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
1a720 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
1a730 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
1a740 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a750 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
1a760 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
1a770 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1a780 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20   if( iTab<0 ){. 
1a790 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
1a7a0 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20  e->ckBase>0 ){. 
1a7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
1a7c0 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e  rating CHECK con
1a7d0 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65  straints or inse
1a7e0 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69  rting into parti
1a7f0 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
1a800 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
1a810 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
1a820 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
1a830 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a850 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69           /* Codi
1a860 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
1a870 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
1a880 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20   an index where 
1a890 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20  column names.   
1a8a0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
1a8b0 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20   index refer to 
1a8c0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69  the table to whi
1a8d0 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c  ch the index bel
1a8e0 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ongs */.        
1a8f0 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
1a900 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20  >iSelfTab;.     
1a910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a920 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1a930 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1a940 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
1a950 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1a980 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
1a990 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
1a9c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a9d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a9e0 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1a9f0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
1aa00 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
1aa10 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
1aa20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1aa30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aa40 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1aa50 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
1aa60 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1aa70 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1aa80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1aa90 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1aaa0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
1aab0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1aac0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
1aad0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1aae0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1aaf0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
1ab00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ab10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ab20 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1ab30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ab40 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
1ab50 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
1ab60 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1ab70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ab80 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
1ab90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aba0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1abb0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1abc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1abd0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1abe0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1abf0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1ac00 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
1ac10 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
1ac20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
1ac30 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
1ac40 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1ac50 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ac60 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1ac70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ac80 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1ac90 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
1aca0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
1acb0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
1acc0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1acd0 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
1ace0 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
1acf0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
1ad00 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
1ad10 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
1ad20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1ad30 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
1ad40 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
1ad50 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
1ad60 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
1ad70 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
1ad80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1ad90 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
1ada0 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
1adb0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
1adc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1add0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1ade0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1adf0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ae00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ae10 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1ae20 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1ae30 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1ae40 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
1ae50 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
1ae60 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
1ae70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ae80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
1ae90 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
1aea0 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
1aeb0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1aec0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
1aed0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1aee0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1aef0 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20  ken[0]=='?' .   
1af00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
1af10 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
1af20 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ken, pParse->azV
1af30 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
1af40 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n-1])==0 );.    
1af50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1af60 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
1af70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
1af80 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20  pr->iColumn-1], 
1af90 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
1afa0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1afb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1afc0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1afd0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
1afe0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
1aff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1b000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b010 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1b020 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1b030 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1b040 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1b050 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1b060 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
1b070 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1b080 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1b090 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1b0a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1b0b0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1b0c0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1b0d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b0e0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
1b0f0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
1b100 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1b110 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
1b120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b130 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
1b140 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
1b170 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
1b180 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
1b190 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
1b1a0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
1b1b0 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
1b1c0 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
1b1d0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1b1e0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1b1f0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
1b200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b210 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b220 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1b230 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
1b240 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1b250 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
1b260 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1b270 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1b280 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
1b290 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
1b2a0 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
1b2b0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1b2c0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1b2d0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1b2e0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1b2f0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1b300 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1b310 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1b320 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1b330 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1b340 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1b350 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
1b360 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
1b370 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1b380 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1b390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b3a0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1b3b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b3c0 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
1b3d0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
1b3e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b3f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1b400 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1b410 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1b420 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1b430 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  se, pLeft, pExpr
1b440 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1b450 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1b460 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
1b470 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20  STOREP2 | p5);. 
1b480 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1b490 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1b4a0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1b4b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1b4c0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1b4d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1b4e0 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1b4f0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1b500 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1b510 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1b520 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1b530 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1b540 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1b550 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1b560 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1b570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1b580 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1b590 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1b5a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1b5b0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1b5c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1b5d0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1b5e0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1b5f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1b600 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1b610 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1b620 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1b630 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1b640 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1b650 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1b660 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1b670 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1b680 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b690 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1b6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1b6b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b6c0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
1b6d0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
1b6e0 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
1b6f0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1b700 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1b710 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1b720 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
1b730 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
1b740 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
1b750 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
1b760 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1b770 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
1b780 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
1b790 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
1b7a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
1b7b0 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
1b7c0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1b7d0 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
1b7e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1b7f0 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1b810 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
1b820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b830 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
1b840 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
1b850 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
1b860 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
1b870 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
1b880 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
1b890 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1b8a0 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
1b8b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
1b8c0 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
1b8d0 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1b8e0 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
1b8f0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1b900 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
1b910 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
1b920 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
1b930 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1b940 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
1b950 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
1b960 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1b970 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
1b980 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
1b990 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
1b9a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1b9b0 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
1b9c0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1b9d0 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
1b9e0 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
1b9f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
1ba00 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1ba10 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
1ba20 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
1ba30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ba40 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
1ba50 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
1ba60 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
1ba70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ba80 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
1ba90 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1baa0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1bab0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1bac0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1bad0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1bae0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1baf0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1bb00 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1bb10 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1bb20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1bb30 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1bb40 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1bb50 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1bb60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bb70 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1bb80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bb90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1bba0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1bbb0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1bbc0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1bbd0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1bbe0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1bbf0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1bc00 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1bc10 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1bc20 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1bc30 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  get);.#ifndef SQ
1bc40 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1bc50 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
1bc60 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
1bc70 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
1bc80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bc90 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1bca0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1bcb0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1bcc0 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
1bcd0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
1bce0 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a  target);.#endif.
1bcf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bd00 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1bd10 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1bd20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1bd30 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1bd40 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1bd50 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1bd60 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1bd70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1bd80 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1bd90 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1bda0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1bdb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1bdc0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1bdd0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1bde0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1bdf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1be00 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1be10 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1be20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1be30 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1be40 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1be50 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1be60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1be70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1be80 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1be90 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1bea0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1beb0 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1bec0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1bed0 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1bee0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1bef0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1bf00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1bf10 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1bf20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1bf30 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1bf40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1bf50 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1bf60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bf70 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1bf80 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1bf90 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  get;.      sqlit
1bfa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bfb0 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
1bfc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bfd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1bfe0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1bff0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1c000 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1c010 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1c020 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1c030 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1c040 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1c050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1c060 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1c070 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1c080 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1c090 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1c0a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c0b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
1c0c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
1c0d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1c0e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1c0f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1c100 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1c110 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1c120 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
1c130 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1c140 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
1c150 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1c160 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1c170 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1c180 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1c190 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1c1a0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1c1b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c1c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
1c1d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1c1e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1c1f0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
1c200 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c210 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1c220 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1c230 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
1c240 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1c250 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
1c260 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
1c270 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1c280 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c290 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1c2a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c2b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c2c0 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
1c2d0 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
1c2e0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1c2f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c300 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
1c310 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
1c320 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
1c330 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c340 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c350 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1c360 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1c370 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1c380 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1c390 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1c3a0 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
1c3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c3c0 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
1c3d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1c3e0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
1c3f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1c400 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
1c410 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
1c420 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c430 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
1c440 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
1c450 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
1c460 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
1c470 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
1c480 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1c490 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
1c4a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1c4d0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
1c4e0 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
1c4f0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
1c500 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
1c510 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
1c520 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1c530 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
1c540 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c550 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
1c560 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1c570 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1c580 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1c590 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1c5a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c5b0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1c5c0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1c5d0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1c5e0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1c5f0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1c600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1c610 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
1c620 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
1c630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c640 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c650 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1c660 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
1c670 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1c680 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
1c690 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1c6a0 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
1c6b0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69  arg, enc, 0);.#i
1c6c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c6d0 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46  LE_UNKNOWN_SQL_F
1c6e0 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  UNCTION.      if
1c6f0 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50 61  ( pDef==0 && pPa
1c700 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1c710 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1c720 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
1c730 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22  on(db, "unknown"
1c740 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
1c750 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1c760 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
1c770 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e  =0 || pDef->xFin
1c780 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20  alize!=0 ){.    
1c790 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c7a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1c7b0 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
1c7c0 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20  s()", zId);.    
1c7d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c7e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
1c7f0 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
1c800 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1c810 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
1c820 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
1c830 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
1c840 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
1c850 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
1c860 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
1c870 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
1c880 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
1c890 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
1c8a0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1c8b0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1c8c0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1c8d0 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
1c8e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
1c8f0 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
1c900 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1c910 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (v);.        ass
1c920 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b  ert( nFarg>=2 );
1c930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c940 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1c950 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1c960 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1c970 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1c980 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1c990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c9a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1c9b0 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20  otNull, target, 
1c9c0 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
1c9d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1c9e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1c9f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ca00 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1ca10 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
1ca20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ca30 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1ca40 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
1ca50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1ca60 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1ca70 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
1ca80 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
1ca90 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1caa0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1cab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1cac0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1cad0 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
1cae0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
1caf0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1cb00 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
1cb10 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
1cb20 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
1cb30 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
1cb40 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
1cb50 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1cb60 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
1cb70 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
1cb80 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1cb90 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
1cba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cbb0 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
1cbc0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1cbd0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1cbe0 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  et(pParse, pFarg
1cbf0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
1cc00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
1cc10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1cc20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1cc30 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
1cc40 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26       if( i<32 &&
1cc50 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1cc60 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b  nstant(pFarg->a[
1cc70 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
1cc80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1cc90 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
1cca0 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
1ccb0 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20   MASKBIT32(i);. 
1ccc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ccd0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
1cce0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
1ccf0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
1cd00 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
1cd10 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1cd20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1cd30 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  eq(pParse, pFarg
1cd40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1cd50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cd60 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67  .      if( pFarg
1cd70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1cd80 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20  constMask ){.   
1cd90 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72         r1 = pPar
1cda0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1cdb0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
1cdc0 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20  em += nFarg;.   
1cdd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cde0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1cdf0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1ce00 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20  Parse, nFarg);. 
1ce10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ce20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28    /* For length(
1ce30 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66  ) and typeof() f
1ce40 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20  unctions with a 
1ce50 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c  column argument,
1ce60 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
1ce70 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  the P5 parameter
1ce80 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d   to the OP_Colum
1ce90 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c  n opcode to OPFL
1cea0 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20  AG_LENGTHARG.   
1ceb0 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41       ** or OPFLA
1cec0 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70  G_TYPEOFARG resp
1ced0 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f  ectively, to avo
1cee0 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64  id unnecessary d
1cef0 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ata.        ** l
1cf00 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  oading..        
1cf10 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
1cf20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1cf30 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  & (SQLITE_FUNC_L
1cf40 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e  ENGTH|SQLITE_FUN
1cf50 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b  C_TYPEOF))!=0 ){
1cf60 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78  .          u8 ex
1cf70 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  prOp;.          
1cf80 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31  assert( nFarg==1
1cf90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1cfa0 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30  sert( pFarg->a[0
1cfb0 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ].pExpr!=0 );.  
1cfc0 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d          exprOp =
1cfd0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1cfe0 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
1cff0 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b    if( exprOp==TK
1d000 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f  _COLUMN || exprO
1d010 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1d020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d030 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
1d040 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c  UNC_LENGTH==OPFL
1d050 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
1d060 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1d070 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
1d080 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54  TYPEOF==OPFLAG_T
1d090 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20  YPEOFARG );.    
1d0a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d0b0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
1d0c0 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  s & OPFLAG_LENGT
1d0d0 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
1d0e0 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e      pFarg->a[0].
1d0f0 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20  pExpr->op2 = .  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
1d120 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  & (OPFLAG_LENGTH
1d130 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f  ARG|OPFLAG_TYPEO
1d140 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20  FARG);.         
1d150 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
1d160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d170 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1d180 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  e);     /* Ticke
1d190 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
1d1a0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1d1b0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1d1c0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
1d1d0 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   r1, 0,.        
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
1d200 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
1d210 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
1d220 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d230 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1d240 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
1d250 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
1d260 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d270 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
1d280 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1d290 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1d2a0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
1d2b0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
1d2c0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
1d2d0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
1d2e0 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
1d2f0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1d300 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
1d310 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
1d320 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
1d330 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
1d340 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
1d350 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
1d360 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1d370 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
1d380 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
1d390 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
1d3a0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1d3b0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
1d3c0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
1d3d0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
1d3e0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
1d3f0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
1d400 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
1d410 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
1d420 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
1d430 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
1d440 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
1d450 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1d460 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
1d470 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
1d480 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1d490 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
1d4a0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
1d4b0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
1d4c0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
1d4d0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
1d4e0 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
1d4f0 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
1d500 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
1d510 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
1d520 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
1d530 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
1d540 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1d550 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
1d560 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
1d570 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
1d580 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
1d590 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
1d5a0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
1d5b0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
1d5c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
1d5d0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
1d5e0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
1d5f0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
1d600 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
1d610 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
1d620 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
1d630 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1d640 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
1d650 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
1d660 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
1d670 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
1d680 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
1d690 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
1d6a0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
1d6b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d6c0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
1d6d0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
1d6e0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
1d6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d710 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30  (v, OP_Function0
1d720 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
1d730 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
1d760 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
1d770 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1d780 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72  geP5(v, (u8)nFar
1d790 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46  g);.      if( nF
1d7a0 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b  arg && constMask
1d7b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
1d7c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1d7d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
1d7e0 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  1, nFarg);.     
1d7f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1d800 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1d810 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d820 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
1d830 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
1d840 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1d850 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
1d860 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d870 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
1d880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d890 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
1d8a0 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f       if( op==TK_
1d8b0 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20  SELECT && (nCol 
1d8c0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
1d8d0 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
1d8e0 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  r)!=1 ){.       
1d8f0 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
1d900 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e  tError(pParse, n
1d910 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Col, 1);.      }
1d920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1d930 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
1d940 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
1d950 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
1d960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1d970 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d980 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1d990 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1d9a0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1d9b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1d9c0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1d9d0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1d9e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1d9f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1da00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1da10 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1da20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1da30 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1da40 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1da50 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1da60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1da70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1da80 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
1da90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1daa0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1dab0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1dac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1dad0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dae0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
1daf0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1db00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1db10 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1db20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1db30 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1db40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1db50 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
1db60 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
1db70 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
1db80 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
1db90 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
1dba0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1dbb0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
1dbc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
1dbd0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1dbe0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
1dbf0 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
1dc00 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1dc10 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
1dc20 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
1dc30 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1dc40 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
1dc50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1dc60 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78  WEEN: {.      ex
1dc70 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
1dc80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1dc90 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  get, 0, 0);.    
1dca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1dcb0 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
1dcc0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1dcd0 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
1dce0 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
1dcf0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1dd00 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1dd10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1dd20 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1dd30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dd40 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
1dd50 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
1dd60 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
1dd70 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
1dd80 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
1dd90 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
1dda0 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
1ddb0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
1ddc0 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
1ddd0 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
1dde0 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
1ddf0 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
1de00 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
1de10 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
1de20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
1de30 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
1de40 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
1de50 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
1de60 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
1de70 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
1de80 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
1de90 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
1dea0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
1deb0 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
1dec0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
1ded0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
1dee0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1def0 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
1df00 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1df10 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
1df20 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
1df30 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
1df40 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
1df50 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
1df60 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
1df70 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
1df80 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
1df90 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
1dfa0 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
1dfb0 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
1dfc0 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
1dfd0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1dfe0 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
1dff0 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
1e000 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
1e010 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
1e020 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
1e030 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1e040 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
1e050 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
1e060 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
1e070 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
1e080 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
1e090 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
1e0a0 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
1e0b0 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
1e0c0 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
1e0d0 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
1e0e0 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
1e0f0 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
1e100 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
1e110 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
1e120 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
1e130 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
1e140 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
1e150 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1e160 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
1e170 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1e180 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
1e190 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
1e1a0 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
1e1b0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
1e1c0 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
1e1d0 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
1e1e0 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
1e1f0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
1e200 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
1e210 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
1e220 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
1e230 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
1e240 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
1e250 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
1e260 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
1e270 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
1e280 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
1e290 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
1e2a0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1e2b0 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
1e2c0 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
1e2d0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
1e2e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
1e2f0 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
1e300 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
1e310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e320 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
1e330 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1e340 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
1e350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1e360 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
1e370 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
1e380 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
1e390 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
1e3a0 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
1e3b0 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
1e3c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e3d0 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
1e3e0 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
1e3f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1e400 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
1e410 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
1e420 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
1e430 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
1e440 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
1e450 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
1e460 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
1e470 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
1e480 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
1e490 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
1e4a0 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
1e4b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1e4c0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1e4d0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
1e4e0 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
1e4f0 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
1e500 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
1e510 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
1e520 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
1e530 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
1e540 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
1e550 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
1e560 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
1e570 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
1e580 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
1e590 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
1e5a0 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
1e5b0 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
1e5c0 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
1e5d0 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
1e5e0 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
1e5f0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1e600 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
1e610 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
1e620 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1e630 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
1e640 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
1e650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e660 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1e670 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
1e680 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1e690 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1e6a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e6b0 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
1e6c0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e6d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e6e0 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20 6f  , "invalid use o
1e6f0 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a 20  f row value");. 
1e700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e710 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1e720 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
1e730 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
1e740 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
1e750 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
1e760 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
1e770 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
1e780 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
1e790 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
1e7a0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1e7b0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1e7c0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1e7d0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1e7e0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
1e7f0 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
1e800 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
1e810 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
1e820 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1e830 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
1e840 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
1e850 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
1e860 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
1e870 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
1e880 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1e890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
1e8a0 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
1e8b0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1e8c0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
1e8d0 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
1e8e0 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
1e8f0 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
1e900 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
1e910 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
1e920 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
1e930 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
1e940 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1e950 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
1e960 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
1e970 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
1e980 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
1e990 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
1e9a0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
1e9b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1e9c0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
1e9d0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
1e9e0 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
1e9f0 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
1ea00 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1ea10 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
1ea20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
1ea30 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
1ea40 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
1ea50 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
1ea60 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
1ea70 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
1ea80 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
1ea90 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
1eaa0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
1eab0 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
1eac0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
1ead0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eaf0 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
1eb00 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
1eb10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
1eb20 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
1eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
1eb40 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
1eb50 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
1eb60 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
1eb70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eb80 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
1eb90 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
1eba0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
1ebb0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ebd0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1ebe0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
1ebf0 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
1ec00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1ec10 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
1ec20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
1ec30 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1ec40 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
1ec50 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
1ec60 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
1ec70 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec90 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
1eca0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
1ecb0 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
1ece0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
1ecf0 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed10 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
1ed20 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
1ed30 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
1ed40 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
1ed50 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
1ed60 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
1ed70 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1ed80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ed90 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1eda0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
1edb0 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
1edc0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
1edd0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
1ede0 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
1edf0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ee00 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
1ee10 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
1ee20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
1ee30 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1ee40 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
1ee50 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1ee60 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
1ee70 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
1ee80 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
1ee90 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
1eea0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1eeb0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
1eec0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
1eed0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
1eee0 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70  empX, sqlite3Exp
1eef0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ef00 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  , pX, &regFree1)
1ef10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1ef20 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1ef30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f   );.        opCo
1ef40 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
1ef50 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
1ef60 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
1ef70 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
1ef80 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
1ef90 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
1efa0 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
1efb0 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
1efc0 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
1efd0 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
1efe0 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
1eff0 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
1f000 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
1f010 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
1f020 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
1f030 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
1f040 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
1f050 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
1f060 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
1f070 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
1f080 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
1f090 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
1f0a0 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
1f0b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1f0c0 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
1f0d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f0e0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1f0f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1f100 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
1f110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
1f120 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
1f130 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
1f140 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
1f150 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1f160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f170 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
1f180 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
1f190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f1a0 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
1f1b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f1c0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
1f1d0 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
1f1e0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
1f1f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f200 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f210 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
1f220 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
1f230 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
1f240 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
1f250 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
1f260 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1f270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f280 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1f290 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
1f2a0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1f2b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f2c0 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
1f2d0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
1f2e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1f2f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f300 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f310 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
1f320 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
1f330 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
1f340 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
1f350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f360 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1f380 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1f390 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
1f3a0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
1f3b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f3c0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1f3d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
1f3e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1f3f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f400 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1f410 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
1f420 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1f430 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1f440 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
1f450 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1f460 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1f470 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
1f480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f490 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f4a0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
1f4b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f4c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1f4d0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
1f4e0 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
1f4f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1f500 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1f510 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
1f520 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
1f530 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1f540 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
1f550 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1f560 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
1f570 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
1f580 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1f590 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
1f5a0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
1f5b0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
1f5c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f5d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1f5e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f5f0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
1f600 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
1f610 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
1f620 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
1f630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1f640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f650 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
1f660 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
1f670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1f680 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
1f690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1f6a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f6b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1f6c0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1f6d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1f6e0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
1f6f0 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
1f700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f710 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
1f720 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
1f730 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
1f740 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
1f750 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
1f760 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1f770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f780 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
1f790 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
1f7a0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
1f7b0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1f7e0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
1f7f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
1f800 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
1f810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f820 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
1f830 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f840 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1f850 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1f860 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1f870 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1f880 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
1f890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
1f8a0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
1f8b0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
1f8c0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
1f8d0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
1f8e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1f8f0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
1f900 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1f910 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1f920 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1f930 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1f940 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
1f950 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
1f960 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
1f970 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
1f980 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
1f990 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
1f9a0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
1f9b0 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20  u8 reusable     
1f9c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1f9d0 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
1f9e0 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  reusable */.){. 
1f9f0 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
1fa00 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
1fa10 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
1fa20 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
1fa30 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78  ConstExpr;.  pEx
1fa40 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1fa50 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
1fa60 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
1fa70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1fa80 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1fa90 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
1faa0 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
1fab0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1fac0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
1fad0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
1fae0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
1faf0 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
1fb00 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
1fb10 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c  usable = reusabl
1fb20 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  e;.  }.  pParse-
1fb30 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
1fb40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1fb50 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1fb60 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1fb70 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
1fb80 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
1fb90 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
1fba0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1fbb0 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
1fbc0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
1fbd0 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
1fbe0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
1fbf0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
1fc00 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
1fc10 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
1fc20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
1fc30 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
1fc40 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
1fc50 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1fc60 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
1fc70 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
1fc80 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
1fc90 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
1fca0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
1fcb0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1fcc0 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
1fcd0 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
1fce0 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
1fcf0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1fd00 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
1fd10 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
1fd20 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
1fd30 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
1fd40 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
1fd50 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
1fd60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fd70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1fd80 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1fd90 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
1fda0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
1fdb0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1fdc0 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  te(pExpr);.  if(
1fdd0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
1fde0 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
1fdf0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
1fe00 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
1fe10 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
1fe20 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
1fe30 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1fe40 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  *p = pParse->pCo
1fe50 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  nstExpr;.    int
1fe60 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   i;.    *pReg  =
1fe70 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b   0;.    if( p ){
1fe80 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1fe90 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1fea0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  em;.      for(pI
1feb0 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e  tem=p->a, i=p->n
1fec0 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d  Expr; i>0; pItem
1fed0 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ++, i--){.      
1fee0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
1fef0 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
1ff00 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
1ff10 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
1ff20 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
1ff30 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
1ff40 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
1ff50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ff60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32    }.    }.    r2
1ff70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ff80 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  m;.    sqlite3Ex
1ff90 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
1ffa0 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20  rse, pExpr, r2, 
1ffb0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1ffc0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
1ffd0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1ffe0 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
1fff0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
20000 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
20010 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
20020 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
20030 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
20040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
20050 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
20060 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
20070 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
20080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20090 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
200a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
200b0 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
200c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
200d0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
200e0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
200f0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
20100 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
20110 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
20120 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
20130 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
20140 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
20150 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
20160 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
20170 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
20180 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
20190 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
201a0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
201b0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
201c0 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
201d0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
201e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
201f0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
20200 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
20210 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
20220 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
20230 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
20240 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
20250 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
20260 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
20270 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
20280 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
20290 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
202a0 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
202b0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
202c0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
202d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
202e0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
202f0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
20300 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
20310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
20320 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
20330 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
20340 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
20350 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
20360 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
20370 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
20380 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
20390 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
203a0 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
203b0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
203c0 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
203d0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
203e0 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
203f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
20400 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
20410 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
20420 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
20430 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
20440 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20450 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
20460 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
20470 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
20480 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20490 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
204a0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
204b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
204c0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
204d0 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
204e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
204f0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
20500 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
20510 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
20520 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
20530 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
20540 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
20550 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
20560 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
20570 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
20580 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
20590 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
205a0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
205b0 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
205c0 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
205d0 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
205e0 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
205f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20600 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
20610 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
20620 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
20630 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
20640 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
20650 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
20660 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
20670 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
20680 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
20690 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
206a0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  pr, target, 0);.
206b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
206c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
206d0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
206e0 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
206f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20700 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
20710 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
20720 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
20730 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
20740 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
20750 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
20760 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
20770 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
20780 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
20790 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
207a0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
207b0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
207c0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
207d0 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
207e0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
207f0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
20800 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
20810 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20820 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
20830 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
20840 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
20850 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
20860 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
20870 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
20880 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
20890 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
208a0 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
208b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
208c0 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
208d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
208e0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
208f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
20900 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
20910 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
20920 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
20930 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
20940 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
20950 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
20960 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
20970 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
20980 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
20990 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
209a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
209b0 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
209c0 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
209d0 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
209e0 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
209f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
20a00 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
20a10 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
20a20 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
20a30 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
20a40 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
20a50 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
20a60 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
20a70 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
20a80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
20a90 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
20aa0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
20ab0 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
20ac0 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
20ad0 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
20ae0 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
20af0 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
20b00 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
20b10 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
20b20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
20b30 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
20b40 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
20b50 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
20b60 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
20b70 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
20b80 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
20b90 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
20ba0 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
20bb0 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
20bc0 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
20bd0 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
20be0 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
20bf0 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
20c00 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
20c10 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
20c20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
20c30 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
20c40 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
20c50 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
20c60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20c70 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
20c80 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
20c90 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
20ca0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
20cb0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
20cc0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
20cd0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
20ce0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
20cf0 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
20d00 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
20d10 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
20d20 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
20d30 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
20d40 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
20d50 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
20d60 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
20d70 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
20d80 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
20d90 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
20da0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
20db0 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
20dc0 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
20dd0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
20de0 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
20df0 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
20e00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
20e10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
20e20 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
20e30 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
20e40 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
20e50 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
20e60 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
20e70 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
20e80 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
20e90 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
20ea0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
20eb0 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
20ec0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
20ed0 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
20ee0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
20ef0 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
20f00 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
20f10 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
20f20 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
20f30 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
20f40 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
20f50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  List->a[i].u.x.i
20f60 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
20f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20f80 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
20f90 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
20fa0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
20fb0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
20fc0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
20fd0 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
20fe0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
20ff0 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
21000 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21010 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
21020 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c  pExpr, target+i,
21030 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
21040 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20        int inReg 
21050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
21060 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
21070 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
21080 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
21090 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
210a0 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
210b0 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Op;.        if( 
210c0 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a  copyOp==OP_Copy.
210d0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70           && (pOp
210e0 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  =sqlite3VdbeGetO
210f0 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64  p(v, -1))->opcod
21100 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  e==OP_Copy.     
21110 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70      && pOp->p1+p
21120 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a  Op->p3+1==inReg.
21130 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
21140 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74  >p2+pOp->p3+1==t
21150 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20  arget+i.        
21160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
21170 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ->p3++;.        
21180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
211a0 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e  p2(v, copyOp, in
211b0 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
211c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
211d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
211e0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
211f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
21200 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65  or a BETWEEN ope
21210 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rator..**.**    
21220 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
21230 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  z.**.** The abov
21240 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
21250 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d  to .**.**    x>=
21260 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a  y AND x<=z.**.**
21270 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
21280 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
21290 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
212a0 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
212b0 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78  elimination of x
212c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
212d0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
212e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
212f0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
21300 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
21310 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
21320 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
21330 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
21340 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
21350 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
21360 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
21370 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
21380 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 76 6f 69 64   taken */.  void
21390 20 28 2a 78 4a 75 6d 70 49 66 29 28 50 61 72 73   (*xJumpIf)(Pars
213a0 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74  e*,Expr*,int,int
213b0 29 2c 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  ),.  int jumpIfN
213c0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
213d0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
213e0 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
213f0 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72  /.){.  Expr expr
21400 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
21410 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
21420 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
21430 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
21440 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
21450 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
21460 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
21470 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
21480 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
21490 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
214a0 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
214b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
214c0 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
214d0 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
214e0 73 74 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65  ster */..  memse
214f0 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
21500 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
21510 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
21520 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
21530 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
21540 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
21550 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
21560 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
21570 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
21580 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
21590 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
215a0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
215b0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
215c0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
215d0 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
215e0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
215f0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
21600 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
21610 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
21620 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
21630 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
21640 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
21650 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
21660 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
21670 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
21680 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
21690 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
216a0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
216b0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
216c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
216d0 78 70 72 49 73 56 65 63 74 6f 72 28 26 65 78 70  xprIsVector(&exp
216e0 72 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  rX)==0 ){.    ex
216f0 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
21700 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  prX, sqlite3Expr
21710 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
21720 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
21730 65 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e1));.  }.  if( 
21740 78 4a 75 6d 70 49 66 20 29 7b 0a 20 20 20 20 78  xJumpIf ){.    x
21750 4a 75 6d 70 49 66 28 70 50 61 72 73 65 2c 20 26  JumpIf(pParse, &
21760 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
21770 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
21780 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e 66  lse{.    exprX.f
21790 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
217a0 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oin;.    sqlite3
217b0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
217c0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
217d0 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71   dest);.  }.  sq
217e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
217f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
21800 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
21810 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
21820 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
21830 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
21840 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
21850 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
21860 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
21870 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
21880 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
21890 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
218a0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
218b0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
218c0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
218d0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
218e0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
218f0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
21900 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
21910 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
21920 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
21930 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
21940 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
21950 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
21960 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
21970 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
21980 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
21990 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
219a0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
219b0 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
219c0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
219d0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
219e0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
219f0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
21a00 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
21a10 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
21a20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
21a30 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
21a40 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
21a50 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
21a60 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
21a70 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
21a80 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
21a90 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
21aa0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
21ab0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
21ac0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
21ad0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
21ae0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
21af0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
21b00 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
21b10 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
21b20 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
21b30 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
21b40 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
21b50 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
21b60 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
21b70 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
21b80 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
21b90 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
21ba0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
21bb0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
21bc0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
21bd0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
21be0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
21bf0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
21c00 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
21c10 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
21c20 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
21c30 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
21c40 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
21c50 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
21c60 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
21c70 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
21c80 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
21c90 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
21ca0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
21cb0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
21cc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
21cd0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
21ce0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
21cf0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
21d00 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
21d10 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
21d20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
21d30 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
21d40 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
21d50 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
21d60 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
21d70 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
21d80 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
21d90 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
21da0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
21db0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
21dc0 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
21dd0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
21de0 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
21df0 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
21e00 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
21e10 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
21e20 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
21e30 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
21e40 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
21e50 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
21e60 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
21e70 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
21e80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
21e90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21ea0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
21eb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21ec0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
21ed0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
21ee0 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
21ef0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
21f00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21f10 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
21f20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
21f30 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
21f40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
21f50 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
21f60 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
21f70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
21f80 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
21f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21fa0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
21fb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21fc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21fd0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
21fe0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
21ff0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
22000 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
22010 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
22020 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
22030 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
22040 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
22050 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
22060 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22070 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
22080 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
22090 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
220a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
220b0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
220c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
220d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
220e0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
220f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
22100 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
22110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
22120 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
22130 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
22140 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
22150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22160 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
22170 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
22180 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22190 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
221a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
221b0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
221c0 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
221d0 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
221e0 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_NE;.      jump
221f0 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
22200 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
22210 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
22220 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
22230 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
22240 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
22250 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
22260 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
22270 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
22280 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
22290 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
222a0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
222b0 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
222c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
222d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
222e0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
222f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
22300 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
22310 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
22320 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
22330 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
22340 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
22350 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
22360 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
22370 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
22380 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
22390 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
223c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
223d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
223e0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
223f0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
22400 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
22410 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
22420 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
22430 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
22440 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
22450 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
22460 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
22470 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
22480 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
22490 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
224a0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
224b0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
224c0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
224d0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
224e0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
224f0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
22500 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
22510 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
22520 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
22530 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
22540 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
22550 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
22560 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
22570 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
22580 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
22590 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
225a0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
225b0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
225c0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
225d0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
225e0 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
225f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
22600 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
22610 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
22620 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
22630 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
22640 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
22650 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
22660 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
22670 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
22680 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
22690 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
226a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
226b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
226c0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
226d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
226e0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
226f0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
22700 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
22710 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
22720 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
22730 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
22740 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
22750 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
22760 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
22770 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
22780 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
22790 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
227a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
227b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
227c0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
227d0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
227e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
227f0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
22800 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
22810 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
22820 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
22830 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
22840 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
22850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22860 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
22870 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
22880 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
22890 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
228a0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
228b0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
228c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
228d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
228e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
228f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
22900 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
22910 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
22920 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
22930 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
22940 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
22950 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
22960 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
22970 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
22980 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
22990 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
229a0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
229b0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
229c0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
229d0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
229e0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
229f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22a00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
22a10 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
22a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
22a30 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
22a40 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
22a50 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65  xpr:.      if( e
22a60 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
22a70 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
22a80 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
22a90 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
22aa0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
22ab0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
22ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
22ad0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
22ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
22af0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22b00 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
22b10 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
22b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22b30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
22b40 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
22b50 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
22b60 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
22b70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
22b80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
22b90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
22ba0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
22bb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
22bc0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
22bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
22be0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
22bf0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
22c00 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
22c10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
22c20 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
22c30 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
22c40 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
22c50 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
22c60 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
22c70 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
22c80 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
22c90 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
22ca0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
22cb0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
22cc0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
22cd0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
22ce0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
22cf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
22d00 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
22d10 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
22d20 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
22d30 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
22d40 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
22d50 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
22d60 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
22d70 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
22d80 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
22d90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
22da0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
22db0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
22dc0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
22dd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
22de0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
22df0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
22e00 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
22e10 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
22e20 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
22e30 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
22e40 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
22e50 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
22e60 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
22e70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
22e80 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
22e90 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
22ea0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
22eb0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
22ec0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
22ed0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
22ee0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
22ef0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
22f00 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
22f10 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
22f20 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
22f30 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
22f40 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
22f50 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
22f60 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
22f70 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
22f80 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
22f90 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
22fa0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
22fb0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
22fc0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
22fd0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
22fe0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
23000 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
23010 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
23020 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
23030 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
23040 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
23050 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
23060 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
23070 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
23080 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
23090 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
230a0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
230b0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
230c0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
230d0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
230e0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
230f0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
23100 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
23110 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
23120 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
23130 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
23140 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
23150 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
23160 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
23170 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
23180 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
23190 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
231a0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
231b0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
231c0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
231d0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
231e0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
231f0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
23200 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
23210 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
23220 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
23230 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
23240 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
23250 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
23260 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
23270 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
23280 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
23290 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
232a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
232b0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
232c0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
232d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
232e0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
232f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
23300 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
23310 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
23320 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
23330 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
23340 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
23350 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
23360 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
23370 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
23380 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
23390 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
233a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
233b0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
233c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
233d0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
233e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
233f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
23400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23410 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
23420 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
23430 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
23440 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
23450 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
23460 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
23470 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
23480 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
23490 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
234a0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
234b0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
234c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
234d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
234e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
234f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
23500 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
23510 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23520 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49  pLeft, d2, jumpI
23530 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
23540 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
23550 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23560 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
23570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23580 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
23590 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
235a0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
235b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
235c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
235d0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
235e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
235f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
23600 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23610 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
23620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23630 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
23640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23650 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
23660 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
23670 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
23680 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23690 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
236a0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
236b0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
236c0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
236d0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
236e0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
236f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
23700 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
23710 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
23720 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
23730 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
23740 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
23750 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
23760 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
23770 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
23780 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
23790 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
237a0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
237b0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
237c0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
237d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
237e0 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
237f0 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
23800 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
23810 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
23820 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
23830 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
23840 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
23850 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
23860 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
23870 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
23880 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
23890 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
238a0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
238b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
238c0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
238d0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
238e0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
23900 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
23910 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
23920 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
23930 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
23940 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
23950 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
23960 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
23970 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
23980 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
23990 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
239a0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
239b0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
239c0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
239d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
239e0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
239f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
23a00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23a10 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
23a20 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
23a30 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
23a40 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
23a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
23a60 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
23a70 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
23a80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
23a90 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
23aa0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
23ab0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
23ac0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
23ad0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
23ae0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
23af0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
23b00 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
23b10 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
23b20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
23b30 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
23b40 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
23b50 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
23b60 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
23b70 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
23b80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
23b90 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
23ba0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
23bb0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
23bc0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
23bd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
23be0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
23bf0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
23c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
23c10 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
23c20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
23c30 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
23c40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
23c50 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
23c60 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
23c70 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
23c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
23c90 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
23ca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
23cb0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
23cc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
23cd0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
23ce0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
23cf0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
23d00 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
23d10 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
23d20 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
23d30 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
23d40 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
23d50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
23d60 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
23d70 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
23d80 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
23d90 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
23da0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
23db0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
23dc0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
23dd0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
23de0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23df0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23e00 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
23e10 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
23e20 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
23e30 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
23e40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23e50 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
23e60 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
23e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23e80 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
23e90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
23ea0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
23eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23ec0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
23ed0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
23ee0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
23ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
23f00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
23f10 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
23f20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
23f30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
23f40 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64  default: {.    d
23f50 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20  efault_expr: .  
23f60 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
23f70 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
23f80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23f90 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
23fa0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
23fb0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
23fc0 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
23fd0 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
23fe0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23ff0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
24000 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
24010 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
24020 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
24030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24040 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
24050 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
24060 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
24070 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
24080 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
24090 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
240a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
240b0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
240c0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
240d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
240e0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
240f0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24100 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
24110 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
24120 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
24130 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
24140 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
24150 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20  e3ExprIfFalse() 
24160 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f  except that a co
24170 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45  py is made of pE
24180 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  xpr before.** co
24190 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61  de generation, a
241a0 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20  nd that copy is 
241b0 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f  deleted after co
241c0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54  de generation. T
241d0 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74  his.** ensures t
241e0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
241f0 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e   pExpr is unchan
24200 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
24210 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44  ite3ExprIfFalseD
24220 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
24230 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
24240 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70  nt dest,int jump
24250 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74  IfNull){.  sqlit
24260 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24270 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f  >db;.  Expr *pCo
24280 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
24290 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
242a0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
242b0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
242c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
242d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
242e0 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Copy, dest, jump
242f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  IfNull);.  }.  s
24300 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
24310 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a  (db, pCopy);.}..
24320 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
24330 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
24340 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
24350 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
24360 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
24370 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
24380 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
24390 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
243a0 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
243b0 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
243c0 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
243d0 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
243e0 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
243f0 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
24400 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
24410 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
24420 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
24430 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
24440 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
24450 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
24460 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
24470 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
24480 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
24490 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
244a0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
244b0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
244c0 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
244d0 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
244e0 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
244f0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
24500 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
24510 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
24520 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
24530 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
24540 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
24550 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
24560 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
24570 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
24580 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
24590 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
245a0 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
245b0 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
245c0 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
245d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
245e0 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
245f0 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
24600 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
24610 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
24620 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
24630 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
24640 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
24650 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
24660 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
24670 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
24680 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
24690 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
246a0 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
246b0 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
246c0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
246d0 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
246e0 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
246f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24700 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
24710 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
24720 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
24730 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
24740 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
24750 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
24760 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
24770 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
24780 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
24790 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
247a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
247b0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
247c0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
247d0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
247e0 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c    u32 combinedFl
247f0 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  ags;.  if( pA==0
24800 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20   || pB==0 ){.   
24810 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
24820 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f   0 : 2;.  }.  co
24830 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41  mbinedFlags = pA
24840 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c  ->flags | pB->fl
24850 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69  ags;.  if( combi
24860 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e  nedFlags & EP_In
24870 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66  tValue ){.    if
24880 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d  ( (pA->flags&pB-
24890 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c  >flags&EP_IntVal
248a0 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e  ue)!=0 && pA->u.
248b0 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56  iValue==pB->u.iV
248c0 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
248d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
248e0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
248f0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
24900 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ->op ){.    if( 
24910 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
24920 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
24930 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
24940 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20  ft, pB, iTab)<2 
24950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24960 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
24970 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pB->op==TK_COLL
24980 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
24990 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42  prCompare(pA, pB
249a0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32  ->pLeft, iTab)<2
249b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
249c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
249d0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
249e0 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
249f0 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54  UMN && pA->op!=T
24a00 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20  K_AGG_COLUMN && 
24a10 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
24a20 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
24a30 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
24a40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24a50 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54  StrICmp(pA->u.zT
24a60 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
24a70 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
24a80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24a90 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
24aa0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
24ab0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
24ac0 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  turn pA->op==TK_
24ad0 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b  COLLATE ? 1 : 2;
24ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
24af0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
24b00 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
24b10 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
24b20 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
24b30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28  ;.  if( ALWAYS((
24b40 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
24b50 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30  EP_TokenOnly)==0
24b60 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d  ) ){.    if( com
24b70 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
24b80 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75  xIsSelect ) retu
24b90 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
24ba0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
24bb0 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
24bc0 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
24bd0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
24be0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
24bf0 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
24c00 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pB->pRight, iTab
24c10 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
24c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
24c30 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
24c40 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
24c50 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
24c60 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
24c70 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
24c80 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75  dFlags & EP_Redu
24c90 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e  ced)==0) && pA->
24ca0 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op!=TK_STRING ){
24cb0 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
24cc0 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
24cd0 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
24ce0 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54        if( pA->iT
24cf0 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
24d00 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d   .       && (pA-
24d10 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
24d20 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c   NEVER(pB->iTabl
24d30 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20  e>=0)) ) return 
24d40 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
24d50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
24d60 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78  * Compare two Ex
24d70 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20  prList objects. 
24d80 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
24d90 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
24da0 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  and .** non-zero
24db0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
24dc0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
24dd0 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
24de0 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
24df0 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
24e00 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
24e10 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
24e20 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
24e30 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
24e40 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
24e50 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
24e60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24e70 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
24e80 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
24e90 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
24ea0 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
24eb0 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
24ec0 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
24ed0 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
24ee0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
24ef0 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
24f00 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
24f10 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
24f20 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
24f30 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
24f40 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
24f50 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
24f60 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
24f70 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
24f80 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
24f90 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
24fa0 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
24fb0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
24fc0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
24fd0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
24fe0 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
24ff0 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69   ExprList *pB, i
25000 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20  nt iTab){.  int 
25010 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26  i;.  if( pA==0 &
25020 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  & pB==0 ) return
25030 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   0;.  if( pA==0 
25040 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  || pB==0 ) retur
25050 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e  n 1;.  if( pA->n
25060 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20  Expr!=pB->nExpr 
25070 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
25080 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78  r(i=0; i<pA->nEx
25090 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
250a0 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d  pr *pExprA = pA-
250b0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
250c0 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20   Expr *pExprB = 
250d0 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pB->a[i].pExpr;.
250e0 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d      if( pA->a[i]
250f0 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e  .sortOrder!=pB->
25100 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
25110 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
25120 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
25130 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45  mpare(pExprA, pE
25140 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
25150 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
25160 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25170 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25180 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65  we can prove the
25190 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73   pE2 will always
251a0 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20   be true if pE1 
251b0 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74  is.** true.  Ret
251c0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20  urn false if we 
251d0 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  cannot complete 
251e0 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20  the proof or if 
251f0 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  pE2 might.** be 
25200 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73  false.  Examples
25210 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a  :.**.**     pE1:
25220 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a   x==5       pE2:
25230 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
25240 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
25250 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20  *     pE1: x>0  
25260 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
25270 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
25280 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
25290 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20   pE1: x=21      
252a0 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d   pE2: x=21 OR y=
252b0 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74  43     Result: t
252c0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
252d0 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20  x!=123     pE2: 
252e0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
252f0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
25300 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20       pE1: x!=?1 
25310 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
25320 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
25330 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
25340 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70  E1: x IS NULL  p
25350 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
25360 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c  L    Result: fal
25370 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
25380 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78   IS ?2    pE2: x
25390 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
253a0 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Reuslt: false.**
253b0 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  .** When compari
253c0 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ng TK_COLUMN nod
253d0 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61  es between pE1 a
253e0 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68  nd pE2, if pE2 h
253f0 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c  as.** Expr.iTabl
25400 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20  e<0 then assume 
25410 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67  a table number g
25420 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a  iven by iTab..**
25430 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  .** When in doub
25440 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  t, return false.
25450 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65    Returning true
25460 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
25470 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70  rformance.** imp
25480 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  rovement.  Retur
25490 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74  ning false might
254a0 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d   cause a perform
254b0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20  ance reduction, 
254c0 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61  but.** it will a
254d0 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63  lways give the c
254e0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e  orrect answer an
254f0 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79  d is hence alway
25500 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s safe..*/.int s
25510 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
25520 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c  sExpr(Expr *pE1,
25530 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
25540 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
25550 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
25560 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d  pE1, pE2, iTab)=
25570 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
25580 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
25590 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20  2->op==TK_OR.   
255a0 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49  && (sqlite3ExprI
255b0 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
255c0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
255d0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
255e0 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
255f0 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
25600 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  2->pRight, iTab)
25610 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75   ).  ){.    retu
25620 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
25630 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  pE2->op==TK_NOTN
25640 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ULL.   && sqlite
25650 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
25660 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c  ->pLeft, pE2->pL
25670 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20  eft, iTab)==0.  
25680 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b   && (pE1->op!=TK
25690 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
256a0 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a  op!=TK_IS).  ){.
256b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
256c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
256d0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
256e0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
256f0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
25700 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
25710 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
25720 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
25730 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
25740 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
25750 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
25760 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
25770 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
25780 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
25790 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
257a0 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
257b0 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
257c0 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
257d0 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
257e0 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
257f0 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
25800 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
25810 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
25820 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
25830 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
25840 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
25850 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
25860 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
25870 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
25880 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
25890 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
258a0 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
258b0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
258c0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
258d0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
258e0 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
258f0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
25900 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
25910 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
25920 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
25930 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
25940 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
25950 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
25960 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
25970 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
25980 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
25990 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
259a0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
259b0 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
259c0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
259d0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
259e0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
259f0 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
25a00 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
25a10 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
25a20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
25a30 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
25a40 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
25a50 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
25a60 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
25a70 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
25a80 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
25a90 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
25aa0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
25ab0 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
25ac0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
25ad0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
25ae0 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
25af0 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
25b00 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
25b10 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
25b20 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
25b30 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
25b40 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
25b50 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
25b60 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
25b70 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
25b80 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
25b90 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
25ba0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
25bb0 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
25bc0 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
25bd0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
25be0 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
25bf0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
25c00 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
25c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
25c20 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
25c30 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
25c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
25c50 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
25c60 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
25c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25c80 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
25c90 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
25ca0 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
25cb0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
25cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
25cd0 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
25ce0 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
25cf0 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
25d00 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
25d10 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
25d20 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
25d30 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
25d40 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
25d50 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
25d60 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
25d70 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
25d80 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
25d90 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
25da0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
25db0 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
25dc0 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
25dd0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
25de0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
25df0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
25e00 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
25e10 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
25e20 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
25e30 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
25e40 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
25e50 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
25e60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
25e70 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
25e80 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
25e90 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
25ea0 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
25eb0 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
25ec0 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
25ed0 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
25ee0 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
25ef0 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
25f00 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
25f10 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
25f20 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
25f30 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
25f40 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
25f50 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
25f60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
25f70 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
25f80 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
25f90 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
25fa0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
25fb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
25fc0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
25fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25fe0 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
25ff0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
26000 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
26010 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
26020 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
26030 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
26040 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
26050 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
26060 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
26070 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
26080 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
26090 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
260a0 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
260b0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
260c0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
260d0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
260e0 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
260f0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
26100 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
26110 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
26120 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
26130 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
26140 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
26150 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
26160 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
26170 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
26180 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
26190 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
261a0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
261b0 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
261c0 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
261d0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
261e0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
261f0 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
26200 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
26210 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
26220 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
26230 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
26240 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
26250 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
26260 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
26270 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
26280 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
26290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
262a0 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
262b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
262c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
262d0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
262e0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
262f0 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
26300 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
26310 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
26320 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
26330 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
26340 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
26350 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
26360 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
26370 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
26380 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
26390 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
263a0 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
263b0 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
263c0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
263d0 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
263e0 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
263f0 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
26400 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
26410 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
26420 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
26430 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
26440 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
26450 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
26460 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
26470 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d  UNCTION );.  mem
26480 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
26490 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
264a0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
264b0 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70  rcCount;.  w.u.p
264c0 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b  SrcCount = &cnt;
264d0 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53  .  cnt.pSrc = pS
264e0 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54  rcList;.  cnt.nT
264f0 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e  his = 0;.  cnt.n
26500 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Other = 0;.  sql
26510 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
26520 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
26530 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ist);.  return c
26540 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e  nt.nThis>0 || cn
26550 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a  t.nOther==0;.}..
26560 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
26570 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
26580 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
26590 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
265a0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
265b0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
265c0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
265d0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
265e0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
265f0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
26600 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
26610 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
26620 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
26630 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
26640 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
26650 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
26660 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
26670 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
26680 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
26690 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
266a0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
266b0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
266c0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
266d0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
266e0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
266f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
26700 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
26710 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
26720 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
26730 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
26740 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
26750 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
26760 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
26770 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
26780 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
26790 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
267a0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
267b0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
267c0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
267d0 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
267e0 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
267f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
26800 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  c[0]),.       &p
26810 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
26820 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
26830 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
26840 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
26850 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
26860 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
26870 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
26880 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
26890 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
268a0 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
268b0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
268c0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
268d0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
268e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
268f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
26900 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
26910 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
26920 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
26930 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
26940 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
26950 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
26960 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
26970 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
26980 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
26990 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
269a0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
269b0 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
269c0 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
269d0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
269e0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
269f0 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
26a00 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
26a10 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
26a20 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
26a30 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
26a40 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
26a50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
26a60 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
26a70 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
26a80 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
26a90 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
26aa0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
26ab0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
26ac0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
26ad0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
26ae0 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
26af0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
26b00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
26b10 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
26b20 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
26b30 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
26b40 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
26b50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
26b60 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
26b70 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
26b80 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
26b90 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
26ba0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
26bb0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
26bc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
26bd0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
26be0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
26bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
26c00 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
26c10 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
26c20 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
26c30 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
26c40 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
26c50 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
26c60 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
26c70 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
26c80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
26c90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
26ca0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
26cb0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
26cc0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
26cd0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
26ce0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
26cf0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
26d00 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
26d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26d20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
26d30 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
26d40 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
26d50 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
26d60 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
26d70 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
26d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26d90 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
26da0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
26db0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
26dc0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
26dd0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
26de0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
26df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26e00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26e10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26e20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
26e30 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
26e40 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
26e50 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
26e60 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
26e70 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
26e80 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
26e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26ea0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
26eb0 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
26ec0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
26ed0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
26ee0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
26ef0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
26f00 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
26f20 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
26f30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
26f40 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
26f50 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
26f60 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
26f70 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
26f80 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
26fa0 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
26fb0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
26fc0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
26fd0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
26fe0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
26ff0 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
27000 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
27010 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
27020 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
27030 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
27040 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
27050 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
27070 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
27090 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
270a0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
270c0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
270d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
270e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
270f0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
27100 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
27110 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
27140 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
27150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27160 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
27170 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
27180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
271d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
271e0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
271f0 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
27210 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
27220 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
27230 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27250 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
27270 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
27280 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
27290 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
272a0 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
272b0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
272c0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
272d0 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
272e0 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
272f0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
27300 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
27310 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
27320 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
27330 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
27340 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
27350 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
27360 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
27370 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
27380 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
27390 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
273a0 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
273b0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
273c0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
273d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
273e0 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
273f0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
27400 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
27410 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
27420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27430 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
27440 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
27450 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
27460 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
27470 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
27480 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
27490 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
274a0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
274b0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
274c0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
274d0 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
274e0 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
274f0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
27500 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
27510 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
27520 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27530 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
27540 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
27550 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
27560 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
27570 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
27580 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
27590 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
275a0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
275b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
275c0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
275d0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
275e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
275f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
27600 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
27610 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
27620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
27630 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
27640 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
27650 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
27660 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
27670 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
27680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27690 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
276a0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
276b0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
276c0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
276d0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
276e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
276f0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
27700 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
27710 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
27720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
27730 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
27740 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
27750 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
27760 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
27770 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27780 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27790 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
277a0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
277b0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
277c0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
277d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
277e0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
277f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
27800 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
27810 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
27820 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
27830 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
27840 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
27850 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
27860 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
27870 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
27880 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
27890 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
278a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
278b0 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
278d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
278e0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
278f0 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
27900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27910 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
27920 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
27930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
27940 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
27950 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
27960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
27970 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27980 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
27990 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
279a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
279b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
279c0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
279d0 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
279e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
279f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
27a00 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
27a10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27a20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
27a30 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
27a40 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
27a50 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
27a60 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
27a70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
27a80 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  e);.        pExp
27a90 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
27aa0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
27ab0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
27ac0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
27ad0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
27ae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27af0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
27b00 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
27b10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
27b20 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
27b30 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
27b40 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
27b50 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72  sInSelect(Walker
27b60 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
27b70 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
27b80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27b90 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53  pWalker);.  UNUS
27ba0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
27bb0 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  lect);.  return 
27bc0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
27bd0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
27be0 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
27bf0 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
27c00 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
27c10 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
27c20 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
27c30 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
27c40 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  o AggInfo object
27c50 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49   that pNC->pAggI
27c60 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  nfo.** points to
27c70 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e  .  Additional en
27c80 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f  tries are made o
27c90 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62  n the AggInfo ob
27ca0 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73  ject as.** neces
27cb0 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
27cc0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
27cd0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
27ce0 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
27cf0 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
27d00 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
27d10 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
27d20 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
27d30 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
27d40 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
27d50 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
27d60 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
27d70 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
27d80 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
27d90 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
27da0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
27db0 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
27dc0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
27dd0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
27de0 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
27df0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
27e00 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
27e10 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
27e20 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
27e30 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
27e40 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
27e50 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
27e60 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
27e70 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
27e80 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
27e90 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
27ea0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
27eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
27ec0 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
27ed0 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
27ee0 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
27ef0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
27f00 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
27f10 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
27f20 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
27f30 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
27f40 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
27f50 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
27f60 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
27f70 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
27f80 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
27f90 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
27fa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
27fb0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
27fc0 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
27fd0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
27fe0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
27ff0 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
28000 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
28010 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
28020 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
28030 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
28040 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
28050 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
28060 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
28070 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
28080 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
28090 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
280a0 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
280b0 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
280c0 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
280d0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
280e0 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
280f0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
28100 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
28110 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
28120 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
28130 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
28140 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
28150 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
28160 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c  then.** the deal
28170 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
28180 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
28190 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
281a0 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
281b0 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
281c0 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
281d0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
281e0 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
281f0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
28200 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
28210 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
28220 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
28230 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
28240 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
28250 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
28260 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
28270 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
28280 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
28290 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
282a0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
282b0 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
282c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
282d0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
282e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
282f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
28300 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
28310 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
28320 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
28330 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
28340 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
28350 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
28360 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
28370 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
28380 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
28390 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
283a0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
283b0 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
283c0 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
283d0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
283e0 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
283f0 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
28400 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
28410 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
28420 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
28430 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
28440 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
28450 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
28460 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
28470 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
28480 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
28490 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
284a0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
284b0 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
284c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
284d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
284e0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
284f0 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  Reg){.  sqlite3E
28500 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
28510 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
28520 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
28530 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
28540 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
28550 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
28560 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
28570 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
28580 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
28590 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
285a0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
285b0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
285c0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
285d0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
285e0 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
285f0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
28600 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
28610 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
28620 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
28630 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
28640 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
28650 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
28660 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
28670 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
28680 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
28690 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
286a0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
286b0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
286c0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
286d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
286e0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
286f0 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
28700 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
28710 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
28720 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
28730 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
28740 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
28750 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
28760 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
28770 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20  Reg<iLast.   && 
28780 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
28790 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20  g>=iFirst.  ){. 
287a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
287b0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
287c0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
287d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
287e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
287f0 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
28800 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
28810 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
28820 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
28830 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
28840 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
28850 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.