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

Artifact 414f4c6b016c4494bfb11713da79f27966871d91:


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 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  TK_COLLATE opera
0be0: 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c  tors and any unl
0bf0: 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69  ikely().** or li
0c00: 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74  kelihood() funct
0c10: 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20  ion at the root 
0c20: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
0c30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0c40: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
0c50: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
0c60: 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26    while( pExpr &
0c70: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
0c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70  y(pExpr, EP_Skip
0c90: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  ) ){.    if( Exp
0ca0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0cb0: 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29  pr, EP_Unlikely)
0cc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
0cd0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
0ce0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
0cf0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
0d00: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0d10: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  x.pList->nExpr>0
0d20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0d40: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
0d50: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
0d60: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
0d70: 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
0d80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0d90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
0da0: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 45  LATE );.      pE
0db0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
0dc0: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ft;.    }.  }   
0dd0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0df0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
0e00: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0e10: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0e20: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0e30: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
0e40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
0e50: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
0e60: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0e70: 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20   sequence might 
0e80: 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
0e90: 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
0ea0: 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65  tor.** or by the
0eb0: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63   presence of a c
0ec0: 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66  olumn with a def
0ed0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0ee0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c  equence..** COLL
0ef0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61  ATE operators ta
0f00: 6b 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65  ke first precede
0f10: 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61  nce.  Left opera
0f20: 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63  nds take.** prec
0f30: 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68  edence over righ
0f40: 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43  t operands..*/.C
0f50: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
0f60: 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  xprCollSeq(Parse
0f70: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0f80: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
0f90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0fa0: 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  db;.  CollSeq *p
0fb0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
0fc0: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
0fd0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
0fe0: 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  nt op = p->op;. 
0ff0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
1000: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 62  & EP_Generic ) b
1010: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70  reak;.    if( op
1020: 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d  ==TK_CAST || op=
1030: 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20  =TK_UPLUS ){.   
1040: 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b     p = p->pLeft;
1050: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
1070: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
1080: 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45   (op==TK_REGISTE
1090: 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f  R && p->op2==TK_
10a0: 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20 20  COLLATE) ){.    
10b0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10c0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
10d0: 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30 2c 20  se, ENC(db), 0, 
10e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
10f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1100: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
1110: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
1120: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
1130: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b         || op==TK
1140: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
1150: 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20  =TK_TRIGGER).   
1160: 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a    && p->pTab!=0.
1170: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
1180: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1190: 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61  && p->pTab!=0 ha
11a0: 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72  ppens when pExpr
11b0: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
11c0: 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f        ** a TK_CO
11d0: 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65  LUMN but was pre
11e0: 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65  viously evaluate
11f0: 64 20 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20  d and cached in 
1200: 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  a register */.  
1210: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69      int j = p->i
1220: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66  Column;.      if
1230: 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1250: 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61  oll = p->pTab->a
1260: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1270: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1280: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
1290: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
12a0: 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  oll, 0);.      }
12b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
12d0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
12e0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
12f0: 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70  ->pLeft && (p->p
1300: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1310: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1320: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1330: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1340: 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  e{.        Expr 
1350: 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69  *pNext  = p->pRi
1360: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ght;.        /* 
1370: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
1380: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
1390: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
13a0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
13b0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13c0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
13d0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
13e0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  );.        /* p-
13f0: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
1400: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
1410: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
1420: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
1430: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
1440: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
1450: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1460: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1470: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1480: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
1490: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
14a0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
14b0: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
14c0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d  if( p->x.pList!=
14d0: 30 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70  0 && ALWAYS(!Exp
14e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
14f0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1500: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1510: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
1520: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
1530: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1540: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1550: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1560: 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c  Property(p->x.pL
1570: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1580: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a   EP_Collate) ){.
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
15a0: 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74  ext = p->x.pList
15b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
15e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1600: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
1610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1630: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1640: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1650: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
1660: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
1670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1680: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
1690: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
16a0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
16b0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
16c0: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
16d0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
16e0: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
16f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1700: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1710: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1720: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1730: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1740: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1750: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
1760: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
1770: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
1780: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
1790: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
17a0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
17b0: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
17c0: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
17d0: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
17e0: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
17f0: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1800: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1810: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1820: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1830: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1840: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1850: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1860: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
1870: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1880: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
1890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
18b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
18e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
18f0: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1900: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1910: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1920: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1930: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1940: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
1950: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
1960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1970: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73  AFF_BLOB;.  }els
1980: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
1990: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
19a0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
19b0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
19c0: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
19d0: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
19e0: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
19f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1a00: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1a10: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1a20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1a30: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1a40: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
1a50: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
1a60: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
1a70: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
1a80: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
1a90: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
1aa0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1ab0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1ac0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1ad0: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1ae0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1af0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1b00: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1b10: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1b20: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1b30: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1b40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
1b50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
1b60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
1b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
1b80: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1b90: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
1ba0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
1bb0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1bc0: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1bd0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1be0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1bf0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1c00: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1c10: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1c20: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1c30: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1c40: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
1c50: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c70: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1c80: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1c90: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
1ca0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1cb0: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1cd0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1ce0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1cf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1d10: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1d20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1d30: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1d40: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
1d50: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
1d60: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
1d70: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
1d80: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
1d90: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
1da0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1db0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1dc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1dd0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1de0: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1df0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1e00: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1e10: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1e20: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1e30: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1e40: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1e50: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1e60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e70: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
1e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1e90: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1ea0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1eb0: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1ec0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1ed0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1ee0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1ef0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1f00: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1f30: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1f40: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1f50: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1f60: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1f70: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1f80: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1f90: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1fb0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1fc0: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1fd0: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1fe0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1ff0: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
2000: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
2010: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
2020: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
2030: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
2040: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
2050: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
2060: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2070: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2080: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
2090: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
20a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
20b0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
20c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
20d0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
20e0: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
2100: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
2110: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
2120: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
2130: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
2140: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
2150: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2160: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
2170: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
2180: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
2190: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
21a0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
21b0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
21c0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
21d0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
21e0: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
21f0: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
2200: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
2210: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
2220: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
2230: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
2240: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
2250: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2260: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
2270: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
2280: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
2290: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
22a0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
22b0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
22c0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
22d0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
22e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
22f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2300: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2310: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2320: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
2330: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2340: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
2350: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2360: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2370: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
2380: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2390: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
23a0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
23b0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
23c0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
23d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
23e0: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
23f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2400: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2410: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2420: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2430: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2450: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
2460: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
2470: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
2480: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
2490: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
24a0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
24b0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
24c0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
24d0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
24e0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
24f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2500: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2510: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2520: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2530: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2540: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
2550: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
2560: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
2570: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
2580: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
2590: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
25a0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
25b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
25c0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
25d0: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
25e0: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
25f0: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2600: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2610: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2620: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2630: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2640: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
2650: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
2660: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2670: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
2680: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
2690: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
26a0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
26c0: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
26d0: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
26e0: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
26f0: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2700: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2710: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2720: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2730: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2740: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
2750: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
2760: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2770: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
2780: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
2790: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
27a0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
27b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
27c0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
27d0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
27e0: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
27f0: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2800: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2810: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2820: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2830: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2840: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
2850: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
2860: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
2870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2880: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
2890: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
28a0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
28b0: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
28c0: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
28d0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
28e0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
28f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2900: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2910: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2920: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2930: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2940: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
2950: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
2960: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
2970: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
2980: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
2990: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
29a0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
29b0: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
29c0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
29d0: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
29e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
29f0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2a00: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2a10: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2a20: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2a30: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2a40: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
2a50: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
2a60: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
2a70: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
2a80: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2a90: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2aa0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2ab0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2ac0: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2ad0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2ae0: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2af0: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2b00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2b10: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2b20: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2b30: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2b40: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
2b50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b60: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
2b70: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
2b80: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
2b90: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2ba0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2bb0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2bc0: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2bd0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2be0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2bf0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2c00: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2c10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c20: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2c30: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c40: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
2c50: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
2c60: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2c70: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
2c80: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2c90: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2ca0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
2cb0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2cc0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2cd0: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2ce0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2cf0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2d00: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d10: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2d20: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2d30: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2d40: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2d50: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2d60: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
2d70: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
2d80: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
2d90: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2da0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2db0: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2dc0: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2dd0: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2de0: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2df0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2e00: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2e10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2e20: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2e30: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2e40: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2e50: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
2e60: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
2e70: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
2e80: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
2e90: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
2ea0: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
2eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ec0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2ed0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2ee0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2ef0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2f00: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2f10: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2f20: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2f30: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2f40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2f50: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2f60: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2f70: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
2f80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
2f90: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
2fa0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2fb0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2fc0: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2fd0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
2fe0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
2ff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
3000: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
3010: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
3020: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
3030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
3040: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
3050: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
3060: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
3070: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
3080: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
3090: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
30a0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
30b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
30c0: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
30d0: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
30e0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
30f0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
3100: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
3110: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
3120: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
3130: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
3140: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
3150: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
3160: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3170: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
3180: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
3190: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
31a0: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
31b0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
31c0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
31d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
31e0: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
31f0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
3200: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
3210: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
3220: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
3230: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
3240: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
3250: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
3260: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
3270: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
3280: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
3290: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
32a0: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
32b0: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
32c0: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
32d0: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
32e0: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
32f0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
3300: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
3310: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
3320: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
3330: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
3340: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
3350: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
3360: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3370: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
3380: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
3390: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
33a0: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
33b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
33c0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
33d0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
33e0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
33f0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
3400: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3410: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
3420: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
3430: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
3440: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
3450: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
3460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3470: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
3480: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
3490: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
34a0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
34b0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
34c0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
34d0: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
34e0: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
34f0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
3500: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
3510: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
3520: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
3530: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
3540: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
3550: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
3560: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
3570: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
3580: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
3590: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
35a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
35b0: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
35c0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
35d0: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
35e0: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
35f0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
3600: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
3610: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
3620: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
3630: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
3640: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
3650: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
3660: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
3670: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
3680: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
3690: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
36a0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
36b0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
36c0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
36d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
36e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
36f0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
3700: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
3710: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
3720: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
3730: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
3740: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
3750: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
3760: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
3770: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
3780: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
3790: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
37a0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
37b0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
37c0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
37d0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
37e0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
37f0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
3800: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
3810: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
3820: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
3830: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
3840: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
3850: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3860: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
3870: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3880: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3890: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38a0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
38b0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
38c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38d0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
38e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
38f0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
3900: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3910: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3920: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
3930: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
3940: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
3950: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
3960: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
3970: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
3980: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
3990: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
39a0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
39b0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
39c0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
39d0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
39e0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
39f0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3a00: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3a10: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3a20: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3a30: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3a40: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3a50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3a60: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3a70: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3a80: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3a90: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3aa0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3ab0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3ac0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3ad0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3ae0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3af0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3b00: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3b10: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3b20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b30: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3b40: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3b50: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3b60: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3b70: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3b80: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3b90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3ba0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3bb0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3bc0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3bd0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3be0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3bf0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3c00: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3c10: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3c20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3c30: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3c40: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3c50: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3c60: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3c70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3c80: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3c90: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3ca0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3cb0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3cc0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ce0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3cf0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3d00: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3d10: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3d20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d30: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3d40: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3d50: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3d60: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3d70: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3d80: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d90: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3da0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3db0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3dd0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3de0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3df0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3e00: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e20: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3e40: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3e50: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3e60: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3e70: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3e80: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3e90: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3ea0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3eb0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3ec0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3ed0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3ee0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3ef0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3f00: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3f10: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3f20: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3f30: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3f40: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3f50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3f60: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3f70: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3f80: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3f90: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3fa0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3fc0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
3fd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
3fe0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
3ff0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
4000: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
4010: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
4020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4050: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4070: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4080: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
4090: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
40a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
40b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
40c0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
40d0: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
40e0: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
40f0: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
4100: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
4110: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
4120: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
4130: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
4140: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
4150: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
4160: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
4170: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
4180: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
4190: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
41a0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
41b0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
41c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
41d0: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
41e0: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
41f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4200: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
4210: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
4220: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
4230: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
4240: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4250: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
4260: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
4270: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
4280: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
4290: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
42a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
42b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42c0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42e0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
42f0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
4300: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
4310: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
4320: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
4330: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
4340: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
4350: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
4360: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
4370: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
4380: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
4390: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
43a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43c0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
43d0: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
43e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
43f0: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4400: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4410: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4420: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4430: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4440: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4450: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54  arse->db, op & T
4460: 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65  KFLG_MASK, pToke
4470: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
4480: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
4490: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
44a0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
44b0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
44c0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
44d0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
44e0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
44f0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4500: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   p;.}../*.** If 
4510: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4520: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
4530: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
4540: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
4550: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
4560: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
4570: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
4580: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
4590: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
45a0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
45b0: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
45c0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
45d0: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
45e0: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
45f0: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
4600: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
4610: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
4620: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
4630: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
4640: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
4650: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
4660: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4670: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
4680: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
4690: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
46a0: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
46b0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
46c0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
46d0: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
46e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
46f0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
4700: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
4710: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
4720: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
4730: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
4740: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
4750: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
4760: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
4770: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
4780: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
4790: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
47a0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
47b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
47c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
47d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
47e0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
47f0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
4800: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4810: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
4820: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
4830: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
4840: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
4850: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4860: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
4870: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
4880: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
4890: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
48a0: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
48b0: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
48c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
48d0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
48e0: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
48f0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
4900: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
4910: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
4920: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
4930: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
4940: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
4950: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4960: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
4970: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
4980: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
4990: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
49a0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
49b0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
49c0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
49d0: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
49e0: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
49f0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
4a00: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
4a10: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
4a20: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
4a30: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
4a40: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
4a50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
4a60: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
4a70: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
4a80: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
4a90: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
4aa0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
4ab0: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
4ac0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4ad0: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
4ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4af0: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
4b00: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
4b10: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4b20: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
4b30: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
4b40: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
4b50: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
4b60: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b70: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
4b80: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4b90: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
4ba0: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
4bb0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
4bc0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
4bd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
4be0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
4bf0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
4c00: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
4c10: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
4c20: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
4c30: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
4c40: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
4c50: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4c60: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
4c70: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
4c80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4c90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4ca0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4cb0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4cc0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4cd0: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4ce0: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4cf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4d00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4d10: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4d20: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
4d30: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
4d40: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
4d50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
4d60: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
4d70: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
4d80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4d90: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4da0: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4db0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4dc0: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
4dd0: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4de0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4df0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4e00: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4e10: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4e20: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
4e30: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
4e40: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
4e50: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
4e60: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
4e70: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
4e80: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4e90: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4ea0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4eb0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4ec0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4ed0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4ee0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4ef0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4f00: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4f10: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4f20: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
4f30: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
4f40: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
4f50: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
4f60: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
4f70: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
4f80: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4f90: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4fa0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4fb0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4fc0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4fd0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4fe0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4ff0: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
5000: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
5010: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
5020: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
5030: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
5040: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
5050: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
5060: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
5070: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
5080: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
5090: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
50a0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
50b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
50c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
50d0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
50e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
50f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5100: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5110: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
5120: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
5130: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
5140: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
5150: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
5160: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
5170: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
5180: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
5190: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
51a0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
51b0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
51c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
51d0: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
51e0: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
51f0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
5200: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
5210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
5220: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
5230: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
5240: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
5250: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
5260: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
5270: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
5280: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
5290: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
52a0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
52b0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
52c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
52d0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
52e0: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
52f0: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
5300: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
5310: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
5320: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5330: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5340: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5350: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
5360: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
5370: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5380: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
5390: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
53a0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
53b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
53c0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
53d0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
53e0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
53f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
5400: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
5410: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5420: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5430: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
5440: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5450: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
5460: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
5470: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
5480: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
5490: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
54a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
54b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
54c0: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
54d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
54e0: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
54f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
5500: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
5510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5520: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
5530: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
5540: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
5550: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
5560: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
5570: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
5580: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
5590: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
55a0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
55b0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
55c0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
55d0: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
55e0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
55f0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
5600: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
5610: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5620: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
5630: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
5640: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
5650: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
5660: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
5670: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
5680: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5690: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
56a0: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
56b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
56c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
56d0: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
56e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
56f0: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
5700: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
5710: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
5720: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
5730: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
5740: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
5750: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
5760: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
5770: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
5780: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5790: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20       if( a==0 ) 
57a0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f  return;  /* Erro
57b0: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
57c0: 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  gh db->mallocFai
57d0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  led */.        p
57e0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61  Parse->azVar = a
57f0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
5800: 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61  (&a[pParse->nzVa
5810: 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65  r], 0, (x-pParse
5820: 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28  ->nzVar)*sizeof(
5830: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  a[0]));.        
5840: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20  pParse->nzVar = 
5850: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
5860: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c   if( z[0]!='?' |
5870: 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  | pParse->azVar[
5880: 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x-1]==0 ){.     
5890: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
58a0: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
58b0: 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20  ar[x-1]);.      
58c0: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b    pParse->azVar[
58d0: 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62  x-1] = sqlite3Db
58e0: 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e  StrNDup(db, z, n
58f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5900: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
5910: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
5920: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
5930: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5940: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
5950: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
5960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5970: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
5980: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
5990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
59a0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
59b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
59c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
59d0: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
59e0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
59f0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
5a00: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69  eturn;.  /* Sani
5a10: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
5a20: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
5a30: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
5a40: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
5a50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
5a60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5a70: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
5a80: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
5a90: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
5aa0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5ab0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
5ac0: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
5ad0: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
5ae0: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
5af0: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
5b00: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
5b10: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
5b20: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
5b30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
5b40: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
5b50: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
5b80: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5b90: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
5ba0: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
5bb0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
5bc0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  zToken);.    if(
5bd0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5be0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5bf0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5c00: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
5c10: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
5c20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
5c40: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
5c50: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
5c60: 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48    }.  if( !ExprH
5c70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5c80: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
5c90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5ca0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
5cb0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5cc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
5cd0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
5ce0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
5cf0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
5d00: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5d10: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
5d20: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
5d30: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
5d40: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5d50: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
5d60: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
5d70: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
5d80: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
5d90: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5da0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5db0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
5dc0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5dd0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5de0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
5df0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
5e00: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5e10: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
5e20: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
5e30: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
5e40: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
5e50: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
5e60: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5e70: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
5e80: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
5e90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
5ea0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5eb0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
5ec0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
5ed0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
5ee0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
5ef0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5f00: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
5f10: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
5f20: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
5f30: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
5f40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
5f50: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
5f60: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
5f70: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
5f80: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
5f90: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
5fa0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
5fb0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6000: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
6010: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
6020: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
6030: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
6040: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
6050: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
6060: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
6070: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
6080: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
6090: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
60a0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
60b0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
60c0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
60d0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
60e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
60f0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
6100: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
6110: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
6120: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
6130: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
6140: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
6150: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
6160: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
6170: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
6180: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
6190: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
61a0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
61b0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
61c0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
61d0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
61e0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
61f0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
6200: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
6210: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6220: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
6230: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
6240: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6250: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
6260: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
6270: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
6280: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
6290: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
62a0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
62b0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
62c0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
62d0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
62e0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
62f0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
6300: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
6310: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
6320: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
6330: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
6340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
6350: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
6360: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
6370: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
6380: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
6390: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
63a0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
63b0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
63c0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
63d0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
63e0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
63f0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
6400: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
6410: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
6420: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
6430: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
6440: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
6450: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
6460: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
6470: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
6480: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
6490: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
64a0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
64b0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
64c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
64d0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
64e0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
64f0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
6500: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
6510: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
6520: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
6530: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
6540: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
6550: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
6560: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
6570: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
6580: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
6590: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28  =0 );.  if( 0==(
65a0: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
65b0: 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69  DUCE) ){.    nSi
65c0: 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49  ze = EXPR_FULLSI
65d0: 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ZE;.  }else{.   
65e0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
65f0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6600: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
6610: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73  uced) );.    ass
6620: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6630: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
6640: 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73  Join) ); .    as
6650: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
6660: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
6670: 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73  Token) );.    as
6680: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
6690: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52  operty(p, EP_NoR
66a0: 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66  educe) );.    if
66b0: 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d  ( p->pLeft || p-
66c0: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
66d0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52    nSize = EXPR_R
66e0: 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f  EDUCEDSIZE | EP_
66f0: 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c  Reduced;.    }el
6700: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
6710: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  ( p->pRight==0 )
6720: 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  ;.      nSize = 
6730: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
6740: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
6750: 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
6760: 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a  eturn nSize;.}..
6770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6780: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
6790: 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72  space in bytes r
67a0: 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
67b0: 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66   the copy .** of
67c0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
67d0: 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ure and a copy o
67e0: 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f  f the Expr.u.zTo
67f0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74  ken string (if t
6800: 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  hat.** string is
6810: 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74   defined.).*/.st
6820: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
6830: 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20  prNodeSize(Expr 
6840: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6850: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75    int nByte = du
6860: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
6870: 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78  e(p, flags) & 0x
6880: 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72  fff;.  if( !Expr
6890: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
68a0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
68b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
68c0: 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
68d0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
68e0: 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20  zToken)+1;.  }. 
68f0: 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e   return ROUND8(n
6900: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
6910: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
6920: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
6930: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
6940: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
6950: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
6960: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
6970: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
6980: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6990: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
69a0: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
69b0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
69c0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
69d0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
69e0: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
69f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
6a00: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
6a10: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
6a20: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
6a30: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20   Expr.u.zToken, 
6a40: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  if any..**.** If
6a50: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
6a60: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
6a70: 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
6a80: 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20   value includes 
6a90: 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70  .** space to dup
6aa0: 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20  licate all Expr 
6ab0: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65  nodes in the tre
6ac0: 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72  e formed by Expr
6ad0: 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45  .pLeft .** and E
6ae0: 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61  xpr.pRight varia
6af0: 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f  bles (but not fo
6b00: 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73  r any structures
6b10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a   pointed to or .
6b20: 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f  ** descended fro
6b30: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
6b40: 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65  st or Expr.x.pSe
6b50: 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e  lect variables).
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6b70: 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70  upedExprSize(Exp
6b80: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
6b90: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
6ba0: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
6bb0: 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45    nByte = dupedE
6bc0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
6bd0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
6be0: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
6bf0: 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  UCE ){.      nBy
6c00: 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53  te += dupedExprS
6c10: 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c  ize(p->pLeft, fl
6c20: 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72  ags) + dupedExpr
6c30: 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20  Size(p->pRight, 
6c40: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
6c50: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65  }.  return nByte
6c60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6c70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
6c80: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78  lar to sqlite3Ex
6c90: 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20  prDup(), except 
6ca0: 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72  that if pzBuffer
6cb0: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   .** is not NULL
6cc0: 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20   then *pzBuffer 
6cd0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
6ce0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
6cf0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a  large enough .**
6d00: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
6d10: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
6d20: 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f   p, the copies o
6d30: 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a  f p->u.zToken.**
6d40: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
6d50: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
6d60: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
6d70: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
6d80: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
6d90: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
6da0: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
6db0: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
6dc0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
6dd0: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
6de0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
6df0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
6e00: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
6e10: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
6e20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6e30: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
6e40: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
6e50: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
6e60: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
6e80: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
6e90: 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  /.  assert( flag
6ea0: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45  s==0 || flags==E
6eb0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
6ec0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6ed0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
6ee0: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
6ef0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
6f00: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
6f10: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
6f20: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
6f30: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
6f40: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
6f50: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6f60: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
6f70: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
6f80: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
6f90: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6fa0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
6fb0: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
6fc0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
6fd0: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
6fe0: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
6ff0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7000: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
7010: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
7020: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
7030: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
7040: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
7050: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
7060: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
7070: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
7080: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
7090: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
70a0: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
70b0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
70c0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
70d0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
70e0: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
70f0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
7100: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
7110: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
7120: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
7130: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
7140: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
7150: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
7160: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
7170: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
7180: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
7190: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
71a0: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
71b0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
71c0: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
71d0: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
71e0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
71f0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
7200: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7210: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
7220: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
7230: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
7240: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7250: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
7260: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7270: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
7280: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7290: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
72a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
72b0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
72c0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
72d0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
72e0: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
72f0: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
7300: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7310: 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 65 78    int nSize = ex
7320: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
7330: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7340: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
7350: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
7360: 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49  Size<EXPR_FULLSI
7370: 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ZE ){ .         
7380: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7390: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
73a0: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
73b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
73c0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
73d0: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
73e0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
73f0: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
7400: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
7410: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
7420: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
7430: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7440: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
7450: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
7460: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
7470: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
7480: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
7490: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  kenOnly);.      
74a0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
74b0: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
74c0: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
74d0: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
74e0: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
74f0: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
7500: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
7510: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
7520: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
7530: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
7540: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
7550: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
7560: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
7570: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7580: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
7590: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
75a0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
75b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  .        /* Fill
75c0: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
75d0: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
75e0: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
75f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7600: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7610: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
7620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7630: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
7640: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
7650: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
7660: 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20  t, isReduced);. 
7670: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7680: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
7690: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
76a0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
76b0: 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64  ->x.pList, isRed
76c0: 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  uced);.        }
76d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
76e0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
76f0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
7700: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
7710: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7720: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
7730: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
7740: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7750: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
7760: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
7770: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
7780: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
7790: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
77a0: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
77b0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
77c0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
77d0: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
77e0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
77f0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7800: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
7810: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
7820: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
7830: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
7840: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7850: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
7860: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
7870: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
7880: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
7890: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
78a0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
78b0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
78c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
78d0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7900: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
7910: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7920: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7930: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
7940: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
7950: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
7960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
7970: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
7980: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
7990: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
79a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
79b0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
79c0: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
79d0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
79e0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
79f0: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
7a00: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
7a10: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
7a20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7a30: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
7a40: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
7a50: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
7a60: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
7a70: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
7a80: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7a90: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
7aa0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
7ab0: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
7ac0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7ad0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
7ae0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
7af0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7b00: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
7b10: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
7b20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
7b30: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
7b40: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
7b50: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7b60: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
7b70: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
7b80: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
7b90: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
7ba0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7bb0: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
7bc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7bd0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
7be0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7bf0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
7c00: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7c10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7c20: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
7c30: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
7c40: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
7c50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
7c60: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
7c70: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
7c80: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
7c90: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
7ca0: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
7cb0: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
7cc0: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
7cd0: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
7ce0: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
7cf0: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
7d00: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
7d10: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
7d20: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
7d30: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
7d40: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
7d50: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7d60: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
7d70: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
7d80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7d90: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
7da0: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
7db0: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
7dc0: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
7dd0: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
7de0: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
7df0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
7e00: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
7e10: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
7e20: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
7e30: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
7e40: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
7e50: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
7e60: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
7e70: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
7e80: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
7e90: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
7ea0: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
7eb0: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
7ec0: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
7ed0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
7ee0: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
7ef0: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
7f00: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
7f10: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
7f20: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
7f30: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
7f40: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
7f50: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
7f60: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
7f70: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
7f80: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
7f90: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
7fa0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
7fb0: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
7fc0: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
7fd0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
7fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
7ff0: 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73  Dup(db, p, flags
8000: 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74  , 0);.}.ExprList
8010: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
8020: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8030: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
8040: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
8050: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
8060: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8070: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
8080: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
8090: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
80a0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
80b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
80c0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
80d0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
80e0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
80f0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
8100: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
8110: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
8120: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
8130: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
8140: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
8150: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
8160: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
8170: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 69 2a 73  llocRaw(db,  i*s
8180: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
8190: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
81a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
81b0: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
81c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
81d0: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
81e0: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
81f0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
8200: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
8210: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
8220: 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  r *pOldExpr = pO
8230: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  ldItem->pExpr;. 
8240: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
8250: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8260: 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66  (db, pOldExpr, f
8270: 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d  lags);.    pItem
8280: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
8290: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
82a0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
82b0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e      pItem->zSpan
82c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
82d0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
82e0: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
82f0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
8300: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
8310: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
8320: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  done = 0;.    pI
8330: 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20  tem->bSpanIsTab 
8340: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61  = pOldItem->bSpa
8350: 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65  nIsTab;.    pIte
8360: 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  m->u = pOldItem-
8370: 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >u;.  }.  return
8380: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
8390: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
83a0: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
83b0: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
83c0: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
83d0: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
83e0: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
83f0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8400: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
8410: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
8420: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
8430: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
8440: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
8450: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
8460: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
8470: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
8480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8490: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
84a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
84b0: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
84c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
84d0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
84e0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
84f0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
8500: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  *db, SrcList *p,
8510: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
8520: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
8530: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
8540: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
8550: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
8560: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
8570: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
8580: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
8590: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
85a0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
85b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
85c0: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
85d0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
85e0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
85f0: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
8600: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
8610: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
8620: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
8630: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
8640: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
8650: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
8660: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
8670: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
8680: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
8690: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
86a0: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
86b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
86c0: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
86d0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
86e0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
86f0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
8700: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
8710: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
8720: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8730: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
8740: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
8750: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
8760: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8770: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
8780: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8790: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
87a0: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
87b0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
87c0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
87d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
87e0: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
87f0: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
8800: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
8810: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
8820: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
8830: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
8840: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
8850: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
8860: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
8870: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
8880: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8890: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
88a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
88b0: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
88c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
88d0: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
88e0: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
88f0: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
8900: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
8910: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
8920: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8930: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8940: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
8950: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
8960: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
8970: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
8980: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
8990: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
89a0: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
89b0: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
89c0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
89d0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
89e0: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
89f0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
8a00: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
8a10: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8a20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
8a30: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
8a40: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
8a50: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
8a60: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
8a70: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
8a80: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
8a90: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
8aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8ab0: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
8ac0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
8ad0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
8ae0: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
8af0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
8b00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8b10: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8b20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8b30: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
8b40: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
8b50: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
8b60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
8b70: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
8b80: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
8b90: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e  allocRaw(db, p->
8ba0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
8bb0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
8bc0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
8bd0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8be0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8bf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e  rn 0;.  }.  /* N
8c00: 6f 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ote that because
8c10: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
8c20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20   allocation for 
8c30: 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20  p->a[] is not.  
8c40: 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61  ** necessarily a
8c50: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73   power of two, s
8c60: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
8c70: 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  nd() may not be 
8c80: 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  called.  ** on t
8c90: 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65  he duplicate cre
8ca0: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
8cb0: 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ction. */.  for(
8cc0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
8cd0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8ce0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
8cf0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
8d00: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
8d10: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
8d20: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
8d30: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8d40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
8d50: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8d60: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8d70: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
8d80: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
8d90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
8da0: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
8db0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
8dc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
8dd0: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
8de0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
8df0: 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66  w, *pPrior;.  if
8e00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
8e10: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
8e20: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8e30: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
8e40: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8e50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8e60: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
8e70: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
8e80: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
8e90: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
8ea0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
8eb0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
8ec0: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
8ed0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
8ee0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8ef0: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
8f00: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
8f10: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
8f20: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
8f30: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
8f40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
8f50: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
8f60: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
8f70: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
8f80: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
8f90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8fa0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
8fb0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8fc0: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
8fd0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
8fe0: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
8ff0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
9000: 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a  pPrior, flags);.
9010: 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
9020: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
9030: 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  New;.  pNew->pNe
9040: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
9050: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
9060: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
9070: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
9080: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
9090: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
90a0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  db, p->pOffset, 
90b0: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
90c0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
90d0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
90e0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
90f0: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
9100: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
9110: 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64  ral;.  pNew->add
9120: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
9130: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
9140: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
9150: 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74  .  pNew->nSelect
9160: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
9170: 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  Row;.  pNew->pWi
9180: 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c  th = withDup(db,
9190: 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71   p->pWith);.  sq
91a0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
91b0: 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c  me(pNew, p->zSel
91c0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
91d0: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
91e0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
91f0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
9200: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
9210: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
9220: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
9230: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
9240: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
9250: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
9260: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
9270: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
9280: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
9290: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
92a0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
92b0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
92c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
92d0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
92e0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
92f0: 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66  entire list is f
9300: 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c  reed and.** NULL
9310: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
9320: 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65  f non-NULL is re
9330: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  turned, then it 
9340: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
9350: 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e   that the new en
9360: 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66  try was successf
9370: 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a  ully appended..*
9380: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
9390: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
93a0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
93b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
93c0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
93d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
93e0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
93f0: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
9400: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
9410: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
9420: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
9430: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
9440: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
9450: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
9460: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9470: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9480: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9490: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
94a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
94b0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
94c0: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
94d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
94e0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
94f0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
9500: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  st->a = sqlite3D
9510: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
9520: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
9530: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ]));.    if( pLi
9540: 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20  st->a==0 ) goto 
9550: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20  no_mem;.  }else 
9560: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
9570: 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  r & (pList->nExp
9580: 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r-1))==0 ){.    
9590: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
95a0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73  item *a;.    ass
95b0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
95c0: 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73  r>0 );.    a = s
95d0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
95e0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  db, pList->a, pL
95f0: 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a  ist->nExpr*2*siz
9600: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
9610: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
9620: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
9630: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
9640: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
9650: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
9660: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
9670: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
9680: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9690: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
96a0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
96b0: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
96c0: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
96d0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
96e0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
96f0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
9700: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
9710: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
9720: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
9730: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
9740: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
9750: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9760: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
9770: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9780: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
9790: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
97a0: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
97b0: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
97c0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
97d0: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
97e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
97f0: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
9800: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
9810: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
9820: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
9830: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
9840: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
9850: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
9860: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
9870: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
9880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
9890: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
98a0: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
98b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
98c0: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
98d0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
98e0: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
98f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
9900: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
9910: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
9920: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
9930: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9940: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
9950: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9960: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9970: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9980: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9990: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
99a0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
99b0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
99c0: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
99d0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
99e0: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
99f0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9a00: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9a10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9a20: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9a30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9a40: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
9a50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9a60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9a70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9a80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9a90: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9aa0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9ab0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9ac0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
9ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
9ae0: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
9af0: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
9b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9b10: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
9b20: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
9b30: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
9b40: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
9b50: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9b60: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
9b70: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
9b80: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9b90: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9ba0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
9bb0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
9bc0: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
9bd0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
9be0: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
9bf0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
9c00: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
9c10: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
9c20: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
9c30: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
9c40: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
9c50: 64 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d  dequote && pItem
9c60: 2d 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65  ->zName ) sqlite
9c70: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
9c80: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
9c90: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
9ca0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
9cb0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
9cc0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9cd0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
9ce0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9cf0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
9d00: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
9d10: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
9d20: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
9d30: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
9d40: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
9d50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9d60: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
9d70: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9d80: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
9d90: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
9da0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
9db0: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
9dc0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9dd0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9de0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9df0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
9e00: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
9e10: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
9e20: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
9e30: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
9e40: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
9e50: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
9e60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9e70: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
9e80: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
9e90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
9ea0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
9eb0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
9ec0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
9ed0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
9ee0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
9ef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
9f00: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
9f10: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
9f20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
9f30: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
9f40: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
9f50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9f60: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
9f70: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
9f80: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
9f90: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9fa0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
9fe0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
9ff0: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
a000: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
a010: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
a020: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
a030: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
a040: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
a050: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
a060: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
a070: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
a080: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
a090: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a0a0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
a0b0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
a0c0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
a0d0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
a0e0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
a0f0: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
a100: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
a110: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
a120: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
a130: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
a140: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
a150: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
a160: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
a170: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
a180: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a190: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
a1a0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
a1b0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
a1c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
a1d0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
a1e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
a1f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
a200: 72 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  rListDelete(sqli
a210: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
a220: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
a230: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
a240: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
a250: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
a260: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
a270: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
a280: 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
a290: 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49  r==0 );.  for(pI
a2a0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
a2b0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
a2c0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
a2d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
a2e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
a2f0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
a300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a310: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
a320: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a330: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
a340: 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  an);.  }.  sqlit
a350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
a360: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
a370: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
a380: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
a390: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
a3a0: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
a3b0: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
a3c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
a3d0: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
a3e0: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
a3f0: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
a400: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
a410: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
a420: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
a430: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
a440: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
a450: 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  {.       Expr *p
a460: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
a470: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
a480: 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
a490: 72 29 20 29 20 6d 20 7c 3d 20 70 45 78 70 72 2d  r) ) m |= pExpr-
a4a0: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
a4b0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
a4c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
a4d0: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
a4e0: 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20   callbacks used 
a4f0: 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  to check express
a500: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69  ions to.** see i
a510: 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73  f they are "cons
a520: 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64  tant" for some d
a530: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e  efinition of con
a540: 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57  stant.  The.** W
a550: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
a560: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
a570: 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61   type of "consta
a580: 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  nt" we are looki
a590: 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  ng.** for..**.**
a5a0: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
a5b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
a5c0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
a5d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
a5e0: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
a5f0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a620: 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =1.**     sqlite
a630: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
a640: 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20  otJoin()        
a650: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a660: 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==2.**     sqli
a670: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
a680: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
a690: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
a6a0: 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71  ode==3.**     sq
a6b0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a6c0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
a6d0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
a6e0: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a  eCode==4 or 5.**
a6f0: 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  .** In all cases
a700: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20  , the callbacks 
a710: 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  set Walker.eCode
a720: 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  =0 and abort if 
a730: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
a740: 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f  * is found to no
a750: 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t be a constant.
a760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
a770: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a780: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  OrFunction() is 
a790: 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  used for evaluat
a7a0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
a7b0: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
a7c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
a7d0: 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64   The Walker.eCod
a7e0: 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65  e value is 5 whe
a7f0: 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20  n parsing.** an 
a800: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20  existing schema 
a810: 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65  and 4 when proce
a820: 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74  ssing a new stat
a830: 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a  ement.  A bound.
a840: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69  ** parameter rai
a850: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ses an error for
a860: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c   new statements,
a870: 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79   but is silently
a880: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
a890: 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69   NULL for existi
a8a0: 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69  ng schemas.  Thi
a8b0: 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f  s allows sqlite_
a8c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68  master tables th
a8d0: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  at .** contain a
a8e0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
a8f0: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65   because they we
a900: 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  re generated by 
a910: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  older versions.*
a920: 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62  * of SQLite to b
a930: 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65  e parsed by newe
a940: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
a950: 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69  Lite without rai
a960: 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72  sing a.** malfor
a970: 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72  med schema error
a980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a990: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
a9a0: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
a9b0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
a9c0: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
a9d0: 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74  er->eCode is 2 t
a9e0: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
a9f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
aa00: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
aa10: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
aa20: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
aa30: 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75   left join disqu
aa40: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
aa50: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
aa60: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
aa70: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
aa80: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
aa90: 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61  ode==2 && ExprHa
aaa0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
aab0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
aac0: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
aad0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
aae0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
aaf0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
ab00: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
ab10: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
ab20: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
ab30: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
ab40: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
ab50: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
ab60: 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65  nd either pWalke
ab70: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
ab80: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
ab90: 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
aba0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
abb0: 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  T flag. */.    c
abc0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
abd0: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
abe0: 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20  er->eCode>=4 || 
abf0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ac00: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
ac10: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
ac20: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
ac30: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
ac40: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
ac50: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
ac60: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
ac70: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
ac80: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
ac90: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
aca0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
acb0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
acc0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
acd0: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
ace0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
acf0: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
ad00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ad10: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
ad20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ad30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
ad40: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
ad50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ad60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
ad70: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
ad80: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
ad90: 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d  ode==3 && pExpr-
ada0: 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
adb0: 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20  ->u.iCur ){.    
adc0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
add0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
ade0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
adf0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
ae00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ae10: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
ae20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ae30: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
ae40: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
ae50: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
ae60: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
ae70: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
ae80: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
ae90: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
aea0: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
aeb0: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
aec0: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
aed0: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
aee0: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
aef0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
af00: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
af10: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
af20: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
af30: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
af40: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
af50: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
af60: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
af70: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
af80: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
af90: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
afa0: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
afb0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
afc0: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
afd0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
afe0: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
aff0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
b000: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
b010: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
b020: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
b030: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
b040: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b050: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
b060: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
b070: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
b080: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65  llow */.      te
b090: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b0a0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
b0b0: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
b0c0: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
b0d0: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  allow */.      r
b0e0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
b0f0: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
b100: 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49   int selectNodeI
b110: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
b120: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
b130: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
b140: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
b150: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
b160: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
b170: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
b180: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
b190: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
b1a0: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
b1b0: 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  ag, int iCur){. 
b1c0: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
b1d0: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
b1e0: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
b1f0: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
b200: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
b210: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
b220: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
b230: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
b240: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
b250: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
b260: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
b270: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
b280: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
b290: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
b2a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
b2b0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
b2c0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
b2d0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
b2e0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
b2f0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
b300: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
b310: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
b320: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
b330: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
b340: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
b350: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
b360: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
b370: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
b380: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
b390: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
b3a0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
b3b0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
b3c0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
b3d0: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
b3e0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
b3f0: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
b400: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
b410: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
b420: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
b430: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
b440: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
b450: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
b460: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
b470: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
b480: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
b490: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
b4a0: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
b4b0: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
b4c0: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
b4d0: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
b4e0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
b4f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b500: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
b510: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
b520: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
b530: 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 2, 0);.}../
b540: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b550: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b560: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b570: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b580: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b590: 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72  for any single r
b5a0: 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ow of the table 
b5b0: 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
b5c0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
b5d0: 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  s, the.** expres
b5e0: 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65  sion must not re
b5f0: 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64  fer to any non-d
b600: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
b610: 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a  ction nor any.**
b620: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
b630: 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73  n iCur..*/.int s
b640: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
b650: 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  eConstant(Expr *
b660: 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  p, int iCur){.  
b670: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
b680: 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a  st(p, 3, iCur);.
b690: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
b6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
b6b0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
b6c0: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
b6d0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
b6e0: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
b6f0: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
b700: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
b710: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
b720: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
b730: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
b740: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
b750: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
b760: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
b770: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b780: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
b790: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
b7a0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
b7b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
b7c0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
b7d0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
b7e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b7f0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
b800: 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
b810: 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
b820: 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
b830: 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
b840: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
b850: 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
b860: 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
b870: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
b880: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
b890: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
b8a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
b8b0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
b8c0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
b8d0: 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
b8e0: 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
b8f0: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
b900: 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
b910: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b920: 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
b930: 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
b940: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
b950: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
b960: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
b970: 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
b980: 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
b990: 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
b9a0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
b9b0: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
b9c0: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
b9d0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
b9e0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
b9f0: 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
ba00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
ba10: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
ba20: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
ba30: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
ba40: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
ba50: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
ba60: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
ba70: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
ba80: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
ba90: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
baa0: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
bab0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
bac0: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
bad0: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
bae0: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
baf0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
bb00: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
bb10: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
bb20: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
bb30: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
bb40: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
bb50: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
bb60: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  c = 0;..  /* If 
bb70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
bb80: 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
bb90: 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
bba0: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
bbb0: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
bbc0: 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
bbd0: 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
bbe0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
bbf0: 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
bc00: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
bc10: 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
bc20: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
bc30: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
bc40: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
bc50: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
bc60: 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
bc70: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
bc80: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
bc90: 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
bca0: 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
bcb0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
bcc0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
bcd0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
bce0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bcf0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
bd00: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
bd10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bd20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bd30: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
bd40: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
bd50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
bd60: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
bd70: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
bd80: 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
bd90: 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
bda0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
bdb0: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
bdc0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
bdd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bde0: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
bdf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
be00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
be10: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
be20: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
be30: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
be40: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
be50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
be60: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
be70: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
be80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
be90: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
bea0: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
beb0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
bec0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
bed0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
bee0: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
bef0: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
bf00: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
bf10: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
bf20: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
bf30: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
bf40: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
bf50: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
bf60: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
bf70: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
bf80: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
bf90: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
bfa0: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
bfb0: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
bfc0: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
bfd0: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
bfe0: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
bff0: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
c000: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
c010: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
c020: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
c030: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
c040: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
c050: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
c060: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
c070: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
c080: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
c090: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
c0a0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
c0b0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
c0c0: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
c0d0: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
c0e0: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
c0f0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
c100: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
c110: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
c120: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
c130: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
c140: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
c150: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
c160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
c170: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
c180: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
c190: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73  OLUMN:.      ass
c1a0: 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20  ert( p->pTab!=0 
c1b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c1c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c1d0: 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
c1e0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
c1f0: 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
c200: 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
c210: 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
c220: 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
c230: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
c240: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
c250: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
c260: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
c270: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
c280: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
c290: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
c2a0: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
c2b0: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
c2c0: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
c2d0: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
c2e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
c2f0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
c300: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
c310: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
c320: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
c330: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
c340: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
c350: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
c360: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
c370: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
c380: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
c390: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
c3a0: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
c3b0: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
c3c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
c3d0: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
c3e0: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
c3f0: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
c400: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
c410: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
c420: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
c430: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
c440: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
c450: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
c460: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
c470: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
c480: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
c490: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
c4a0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
c4b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
c4c0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
c4d0: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
c4e0: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
c4f0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
c500: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
c510: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
c520: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
c530: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
c540: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
c550: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
c560: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c570: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
c580: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
c590: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
c5a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c5b0: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
c5c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
c5d0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
c5e0: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
c5f0: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
c600: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
c610: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
c620: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
c630: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
c640: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
c650: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
c660: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c670: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
c680: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
c690: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
c6a0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
c6b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
c6c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
c6d0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
c6e0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
c6f0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
c700: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
c710: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
c720: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
c730: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
c740: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
c750: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
c760: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
c770: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
c780: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
c790: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
c7a0: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
c7b0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
c7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c7d0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
c7e0: 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f  able to the IN o
c7f0: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
c800: 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65  tion on a.** que
c810: 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
c820: 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20  *.**       x IN 
c830: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
c840: 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  ** Where the SEL
c850: 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73  ECT... clause is
c860: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79   as specified by
c870: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   the parameter t
c880: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
c890: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c  e..**.** The Sel
c8a0: 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
c8b0: 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79  d in has already
c8c0: 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73   been preprocess
c8d0: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72  ed and no.** err
c8e0: 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f  ors have been fo
c8f0: 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  und..*/.#ifndef 
c900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c910: 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20  UERY.static int 
c920: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
c930: 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Opt(Select *p){.
c940: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
c950: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c960: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
c970: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
c980: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9a0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
c9b0: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
c9c0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
c9d0: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c9f0: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
ca00: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
ca10: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
ca20: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
ca30: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
ca40: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
ca50: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
ca60: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
ca70: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
ca80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ca90: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
caa0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
cab0: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
cac0: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
cad0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
cae0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
caf0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
cb00: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
cb10: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
cb20: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb40: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
cb50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
cb60: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
cb70: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cb80: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
cb90: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
cba0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
cbb0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
cbc0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
cbd0: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
cbe0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
cbf0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc10: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
cc20: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
cc30: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
cc40: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
cc50: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
cc60: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
cc70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
cc80: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
cc90: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
cca0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
ccb0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
ccc0: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
ccd0: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
cce0: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
ccf0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
cd00: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
cd10: 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  b==0) ) return 0
cd20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
cd30: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
cd40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
cd50: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
cd60: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
cd70: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
cd80: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
cd90: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
cda0: 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
cdb0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
cdc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
cdd0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
cde0: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
cdf0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
ce00: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
ce10: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66  sult set */.  if
ce20: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
ce30: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
ce40: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
ce50: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
ce60: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72  olumn */.  retur
ce70: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
ce80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
ce90: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
cea0: 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20  Code an OP_Once 
ceb0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
cec0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
ced0: 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74  or its flag. Ret
cee0: 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72  urn the .** addr
cef0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
cf00: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  nstruction..*/.i
cf10: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e  nt sqlite3CodeOn
cf20: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
cf30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
cf40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
cf50: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
cf60: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
cf70: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
cf80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
cf90: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
cfa0: 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  nce, pParse->nOn
cfb0: 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ce++);.}../*.** 
cfc0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
cfd0: 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
cfe0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
cff0: 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
d000: 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
d010: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
d020: 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
d030: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
d040: 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
d050: 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
d060: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
d070: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
d080: 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
d090: 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
d0a0: 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
d0b0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
d0c0: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
d0d0: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
d0e0: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
d0f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
d100: 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
d110: 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
d120: 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
d130: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71   int addr1;.  sq
d140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d150: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
d160: 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20  , regHasNull);. 
d170: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
d180: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d190: 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20  _Rewind, iCur); 
d1a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d1b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d1c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d1d0: 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48  n, iCur, 0, regH
d1e0: 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  asNull);.  sqlit
d1f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
d200: 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
d210: 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  RG);.  VdbeComme
d220: 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e  nt((v, "first_en
d230: 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75  try_in(%d)", iCu
d240: 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r));.  sqlite3Vd
d250: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d260: 64 72 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  dr1);.}...#ifnde
d270: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
d280: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
d290: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
d2a0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d2b0: 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
d2c0: 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
d2d0: 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
d2e0: 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
d2f0: 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
d300: 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
d310: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
d320: 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
d330: 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
d340: 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
d350: 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
d360: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
d370: 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
d380: 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
d390: 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
d3a0: 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
d3b0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
d3c0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
d3d0: 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
d3e0: 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
d3f0: 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
d400: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d410: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
d420: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
d430: 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
d440: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
d450: 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
d460: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
d470: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
d480: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
d490: 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
d4a0: 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
d4b0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
d4c0: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
d4d0: 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
d4e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
d4f0: 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
d500: 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
d510: 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
d520: 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
d530: 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
d540: 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
d550: 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
d560: 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
d570: 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
d580: 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
d590: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
d5a0: 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
d5b0: 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
d5c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
d5d0: 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
d5e0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
d5f0: 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
d600: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
d610: 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
d620: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
d630: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
d640: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
d650: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
d660: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
d670: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
d680: 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
d690: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
d6a0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
d6b0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
d6c0: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
d6d0: 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
d6e0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d6f0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
d700: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
d710: 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
d720: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
d730: 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
d740: 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
d750: 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
d760: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
d770: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d780: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
d790: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
d7c0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
d7d0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
d7e0: 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
d7f0: 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
d800: 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
d810: 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
d840: 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
d850: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
d860: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
d870: 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
d880: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
d890: 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
d8a0: 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
d8b0: 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
d8c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
d8d0: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
d8e0: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
d8f0: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
d900: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
d910: 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
d920: 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
d930: 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
d940: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
d950: 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
d960: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
d970: 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
d980: 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
d990: 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
d9a0: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
d9b0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
d9c0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
d9d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46  e..**.** The inF
d9e0: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d  lags parameter m
d9f0: 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63  ust contain exac
da00: 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  tly one of the b
da10: 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
da20: 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
da30: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66  _INDEX_LOOP.  If
da40: 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e   inFlags contain
da50: 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
da60: 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74  MBERSHIP, then t
da70: 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
da80: 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
da90: 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65  for a.** fast me
daa0: 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20  mbership test.  
dab0: 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45  When the IN_INDE
dac0: 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65  X_LOOP bit is se
dad0: 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64  t, the.** IN ind
dae0: 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ex will be used 
daf0: 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  to loop over all
db00: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52   values of the R
db10: 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20  HS of the.** IN 
db20: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
db30: 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
db40: 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
db50: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
db60: 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
db70: 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
db80: 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
db90: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
dba0: 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
dbb0: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
dbc0: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
dbd0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
dbe0: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
dbf0: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
dc00: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
dc10: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
dc20: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
dc30: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
dc40: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
dc50: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
dc60: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
dc70: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
dc80: 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  When IN_INDEX_ME
dc90: 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64  MBERSHIP is used
dca0: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
dcb0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
dcc0: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
dcd0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29  embership tests)
dce0: 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d   then an epherem
dcf0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
dd00: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
dd10: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
dd20: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
dd30: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
dd40: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
dd50: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
dd60: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
dd70: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
dd80: 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
dd90: 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
dda0: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
ddb0: 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
ddc0: 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
ddd0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
dde0: 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
ddf0: 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
de00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
de10: 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
de20: 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
de30: 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
de40: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
de50: 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
de60: 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
de70: 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
de80: 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
de90: 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
dea0: 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
deb0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
dec0: 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
ded0: 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
dee0: 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
def0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
df00: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
df10: 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
df20: 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
df30: 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
df40: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
df50: 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
df60: 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
df70: 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
df80: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
df90: 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
dfa0: 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
dfb0: 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
dfc0: 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
dfd0: 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
dfe0: 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
dff0: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
e000: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
e010: 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
e020: 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
e030: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
e040: 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
e050: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
e060: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
e070: 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
e080: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
e090: 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
e0a0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
e0b0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
e0c0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
e0d0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
e0e0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
e0f0: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
e100: 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
e110: 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
e120: 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
e130: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
e140: 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
e150: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
e160: 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
e170: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
e180: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
e190: 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
e1a0: 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
e1b0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
e1c0: 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
e1d0: 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69  LL values..*/.#i
e1e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e1f0: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
e200: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
e210: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
e220: 20 45 78 70 72 20 2a 70 58 2c 20 75 33 32 20 69   Expr *pX, u32 i
e230: 6e 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70 72 52  nFlags, int *prR
e240: 68 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 53 65  hsHasNull){.  Se
e250: 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20  lect *p;        
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
e280: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e   the right of IN
e290: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
e2a0: 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20  nt eType = 0;   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
e2d0: 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e  RHS table. IN_IN
e2e0: 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69  DEX_* */.  int i
e2f0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
e300: 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  ab++;           
e310: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68   /* Cursor of th
e320: 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20  e RHS table */. 
e330: 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75   int mustBeUniqu
e340: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e350: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
e360: 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e  f RHS must be un
e370: 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ique */.  Vdbe *
e380: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e390: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
e3a0: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
e3b0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
e3c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d  /..  assert( pX-
e3d0: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
e3e0: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28  mustBeUnique = (
e3f0: 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
e400: 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20  EX_LOOP)!=0;..  
e410: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
e420: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  if an existing t
e430: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61  able or index ca
e440: 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  n be used to.  *
e450: 2a 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75  * satisfy the qu
e460: 65 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72  ery.  This is pr
e470: 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65  eferable to gene
e480: 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20  rating a new .  
e490: 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  ** ephemeral tab
e4a0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28  le..  */.  p = (
e4b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e4c0: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
e4d0: 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  ) ? pX->x.pSelec
e4e0: 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 50  t : 0);.  if( pP
e4f0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
e500: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e510: 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73  nOpt(p) ){.    s
e520: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e530: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
e540: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e550: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
e560: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
e590: 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
e5a0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
e5d0: 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e  pression <column
e5e0: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f  > */.    i16 iCo
e5f0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
e620: 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  mn <column> */. 
e630: 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e660: 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
e670: 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ab */..    asser
e680: 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20  t( p );         
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6a0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
e6b0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
e6c0: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
e6d0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
e6e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
e6f0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
e700: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
e710: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
e720: 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
e730: 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
e740: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
e750: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
e760: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
e770: 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e790: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
e7a0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
e7b0: 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
e7c0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
e7d0: 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20  pTab;.    pExpr 
e7e0: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
e7f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
e800: 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e  l = (i16)pExpr->
e810: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20  iColumn;.   .   
e820: 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
e830: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
e840: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
e850: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
e860: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
e870: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
e880: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
e890: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
e8a0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
e8b0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
e8c0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
e8d0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
e8e0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
e8f0: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
e900: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e910: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
e920: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
e930: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
e940: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
e950: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
e960: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
e970: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
e980: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
e990: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
e9a0: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
e9b0: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
e9c0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
e9d0: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
e9e0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e9f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64  Parse);.      Vd
ea00: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
ea10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
ea20: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
ea30: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
ea40: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
ea50: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
ea60: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
ea70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ea80: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
ea90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eaa0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
ead0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
eae0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
eaf0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
eb00: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
eb10: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
eb20: 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
eb30: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
eb40: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
eb50: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
eb60: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
eb70: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
eb80: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
eb90: 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  quence.  */.    
eba0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
ebb0: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
ebc0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
ebd0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
ebe0: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
ebf0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
ec00: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
ec10: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
ec20: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
ec30: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
ec40: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
ec50: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
ec60: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
ec70: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
ec80: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
ec90: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
eca0: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
ecb0: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
ecc0: 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
ecd0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
ece0: 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pX, pTab->aCol[i
ecf0: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a  Col].affinity);.
ed00: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
ed10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
ed20: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
ed30: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
ed40: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ed50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
ed60: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
ed70: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
ed80: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
ed90: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
eda0: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
edb0: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
edc0: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
edd0: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
ede0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
edf0: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
ee00: 49 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29  Idx))).        )
ee10: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
ee20: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
ee30: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
ee40: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ee50: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ee60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ee70: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
ee80: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
ee90: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
eea0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
eeb0: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
eec0: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
eed0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
eee0: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
eef0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
ef00: 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
ef10: 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
ef20: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
ef30: 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
ef40: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
ef50: 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
ef60: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
ef70: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ];..          if
ef80: 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  ( prRhsHasNull &
ef90: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
efa0: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
efb0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
efc0: 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
efd0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
efe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
eff0: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
f000: 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e  iTab, *prRhsHasN
f010: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
f020: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
f030: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f040: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
f050: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f060: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f070: 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
f080: 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
f090: 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
f0a0: 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
f0b0: 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
f0c0: 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
f0d0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
f0e0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
f0f0: 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
f100: 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
f110: 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
f120: 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20   not contant or 
f130: 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
f140: 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
f150: 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
f160: 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
f170: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
f180: 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74   evaluate.  ** t
f190: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73  he IN operator s
f1a0: 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  o return IN_INDE
f1b0: 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69  X_NOOP..  */.  i
f1c0: 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26  f( eType==0.   &
f1d0: 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  & (inFlags & IN_
f1e0: 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20  INDEX_NOOP_OK). 
f1f0: 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
f200: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
f210: 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21  Select).   && (!
f220: 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
f230: 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58  nstant(pX) || pX
f240: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
f250: 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54  <=2).  ){.    eT
f260: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e  ype = IN_INDEX_N
f270: 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a  OOP;.  }.     ..
f280: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
f290: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
f2a0: 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  ot find an exist
f2b0: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
f2c0: 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
f2d0: 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
f2e0: 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
f2f0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
f300: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
f310: 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
f320: 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61     */.    u32 sa
f330: 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
f340: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
f350: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79  op;.    int rMay
f360: 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
f370: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
f380: 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
f390: 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
f3a0: 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20  EX_LOOP ){.     
f3b0: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
f3c0: 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  oop = 0;.      i
f3d0: 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
f3e0: 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
f3f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
f400: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
f410: 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
f420: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
f430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f440: 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  se if( prRhsHasN
f450: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  ull ){.      *pr
f460: 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61  RhsHasNull = rMa
f470: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
f480: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f490: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
f4a0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
f4b0: 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
f4c0: 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
f4d0: 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20  NDEX_ROWID);.   
f4e0: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
f4f0: 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
f500: 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yLoop;.  }else{.
f510: 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
f520: 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74   iTab;.  }.  ret
f530: 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
f540: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
f550: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
f560: 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
f570: 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
f580: 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
f590: 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
f5a0: 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
f5b0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
f5c0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
f5d0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
f5e0: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
f5f0: 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
f600: 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
f610: 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
f620: 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
f640: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
f650: 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
f660: 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
f670: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
f680: 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
f690: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
f6a0: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
f6b0: 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
f6c0: 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
f6d0: 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
f6e0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
f6f0: 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
f700: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
f710: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
f720: 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
f730: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
f740: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
f750: 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
f760: 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
f770: 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
f780: 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
f790: 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
f7a0: 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
f7b0: 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
f7c0: 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
f7d0: 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
f7e0: 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
f7f0: 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
f800: 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
f810: 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
f820: 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
f830: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
f840: 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
f850: 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
f860: 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
f870: 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
f880: 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
f890: 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
f8a0: 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
f8b0: 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
f8c0: 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
f8d0: 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
f8e0: 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
f8f0: 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
f900: 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
f910: 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
f920: 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
f930: 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
f940: 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
f950: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
f960: 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
f970: 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
f980: 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
f990: 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
f9a0: 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
f9b0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
f9c0: 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
f9d0: 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
f9e0: 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
f9f0: 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
fa00: 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65  ult.  For IN ope
fa10: 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20  rators or if an 
fa20: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
fa30: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
fa40: 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  s 0..*/.#ifndef 
fa50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
fa60: 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  UERY.int sqlite3
fa70: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
fa80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fa90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
faa0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fab0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fad0: 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45  IN, SELECT, or E
fae0: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a  XISTS operator *
faf0: 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c  /.  int rHasNull
fb00: 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52  Flag,       /* R
fb10: 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63  egister that rec
fb20: 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c  ords whether NUL
fb30: 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20  Ls exist in RHS 
fb40: 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64  */.  int isRowid
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb60: 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20  If true, LHS of 
fb70: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
fb80: 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69   rowid */.){.  i
fb90: 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20  nt jmpIfDynamic 
fba0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
fbb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
fbc0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
fbd0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65  ess */.  int rRe
fbe0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
fc10: 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
fc20: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
fc30: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
fc40: 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  rse);.  if( NEVE
fc50: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
fc60: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
fc70: 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
fc80: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  e);..  /* This c
fc90: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
fca0: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
fcb0: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
fcc0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
fcd0: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
fce0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
fcf0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
fd00: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
fd10: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
fd20: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
fd30: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
fd40: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
fd50: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
fd60: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
fd70: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
fd80: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
fd90: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
fda0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
fdb0: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
fdc0: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
fdd0: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
fde0: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
fdf0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
fe00: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
fe10: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
fe20: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
fe30: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
fe40: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
fe50: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
fe60: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d  elect) ){.    jm
fe70: 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c  pIfDynamic = sql
fe80: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
fe90: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
fea0: 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ge(v);.  }..#ifn
feb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fec0: 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50  EXPLAIN.  if( pP
fed0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
fee0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
fef0: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
ff00: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
ff10: 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
ff20: 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20  BQUERY %d",.    
ff30: 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
ff40: 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
ff50: 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
ff60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
ff70: 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a  LIST":"SCALAR",.
ff80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
ff90: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
ffa0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
ffb0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ffc0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
ffd0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
ffe0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
fff0: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
10000 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
10010 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
10020 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
10030 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10050 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
10060 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
10070 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
100a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
100b0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
100c0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
100d0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
100e0 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
100f0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
10100 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
10110 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
10120 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
10130 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  ormation */..   
10140 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
10150 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
10160 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
10170 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
10180 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
10190 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
101a0 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
101b0 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
101c0 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
101d0 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
101e0 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
101f0 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
10200 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
10210 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
10220 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
10230 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
10240 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
10250 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
10260 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
10270 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
10280 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
10290 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
102a0 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
102b0 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
102c0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
102d0 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
102e0 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
102f0 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
10300 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
10310 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
10320 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
10330 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
10340 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
10350 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
10360 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
10370 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
10380 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
10390 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
103a0 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
103b0 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
103c0 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
103d0 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
103e0 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
103f0 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
10400 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
10410 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
10420 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
10430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
10440 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
10450 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
10460 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10480 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10490 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
104a0 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
104b0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
104c0 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
104d0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
104e0 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b  arse->db, 1, 1);
104f0 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
10500 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
10510 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
10520 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
10530 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
10540 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
10550 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
10560 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
10570 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
10580 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
10590 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
105a0 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
105b0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
105c0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
105d0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
105e0 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
105f0 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
10600 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
10610 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
10620 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
10630 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
10640 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
10650 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
10660 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10670 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
10680 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
10690 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
106a0 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74      dest.affSdst
106b0 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b   = (u8)affinity;
106c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
106d0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
106e0 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
106f0 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
10700 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
10710 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
10720 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
10730 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
10740 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
10750 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10760 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
10770 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
10780 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
10790 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
107a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
107b0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
107c0 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
107d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
107e0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
107f0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  (pKeyInfo);.    
10800 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10820 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
10830 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
10840 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
10850 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f  Info!=0 ); /* OO
10860 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69  M will cause exi
10870 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53  t after sqlite3S
10880 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20  elect() */.     
10890 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
108a0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
108b0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e  assert( pEList->
108c0 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
108d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
108e0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
108f0 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
10900 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
10910 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
10920 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
10930 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
10940 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
10990 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
109a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
109b0 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
109c0 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
109d0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
109e0 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
109f0 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
10a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  .        ** For 
10a10 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
10a20 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
10a30 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
10a40 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
10a50 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
10a60 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
10a70 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
10a80 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
10a90 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
10aa0 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
10ab0 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
10ac0 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
10ad0 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
10ae0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
10af0 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
10b00 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
10b10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10b20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
10b30 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
10b40 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
10b50 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
10b60 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
10b70 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
10b80 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
10b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
10ba0 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
10bb0 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
10bc0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
10bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10be0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
10bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
10c00 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
10c10 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
10c20 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
10c30 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
10c40 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
10c50 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10c60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10c70 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
10c80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
10c90 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
10ca0 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
10cb0 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
10cc0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
10cd0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10ce0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
10cf0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10d00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
10d10 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73   if( isRowid ) s
10d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10d30 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
10d40 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r2);.        for
10d50 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
10d60 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
10d70 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
10d80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
10d90 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
10da0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
10db0 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
10dc0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
10dd0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
10de0 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
10df0 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
10e00 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
10e10 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
10e20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
10e30 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
10e40 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
10e50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
10e60 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
10e70 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
10e80 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
10e90 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
10ea0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
10eb0 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
10ec0 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
10ed0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
10ee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
10ef0 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
10f00 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
10f10 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
10f20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10f30 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
10f40 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
10f50 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
10f60 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
10f70 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
10f80 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
10f90 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
10fa0 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
10fb0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
10fc0 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
10fd0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
10fe0 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
10ff0 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
11000 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
11010 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11020 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11030 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
11040 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
11050 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
11060 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11070 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
11080 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
11090 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
110a0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
110b0 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
110c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
110d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
110e0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
110f0 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11120 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
11130 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
11140 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11170 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
11180 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11190 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
111a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
111b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
111c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
111d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
111e0 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
111f0 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
11200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11210 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
11220 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
11230 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
11240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11250 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
11260 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
11270 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
11280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11290 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
112a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
112b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
112c0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
112d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
112e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
112f0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
11300 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
11310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11320 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
11330 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
11340 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
11350 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
11360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11370 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
11380 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
11390 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
113a0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
113b0 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
113c0 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
113d0 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
113e0 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
113f0 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
11400 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
11410 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
11420 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
11430 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
11440 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
11450 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
11460 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
11470 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
11480 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
11490 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
114a0 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
114b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
114c0 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
114d0 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
114e0 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
114f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c      */.      Sel
11500 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20  ect *pSel;      
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
11530 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65  tement to encode
11540 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
11550 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77  /* How to deal w
11580 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c  ith SELECt resul
11590 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  t */..      test
115a0 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
115b0 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
115c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
115d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
115e0 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
115f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
11600 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70  K_EXISTS || pExp
11610 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
11620 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   );..      asser
11630 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
11640 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
11650 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
11660 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78   pSel = pExpr->x
11670 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
11680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
11690 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20  tInit(&dest, 0, 
116a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
116b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
116c0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
116d0 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  ){.        dest.
116e0 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b  eDest = SRT_Mem;
116f0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53  .        dest.iS
11700 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61  dst = dest.iSDPa
11710 72 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rm;.        sqli
11720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11730 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
11740 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
11750 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
11760 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
11770 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
11780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11790 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
117a0 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
117b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
117c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
117d0 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ger, 0, dest.iSD
117e0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
117f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11800 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
11810 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
11820 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11830 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
11840 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
11850 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
11860 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
11870 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
11880 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20  NTEGER, 0, 0,.  
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
118c0 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65  s[1]);.      pSe
118d0 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
118e0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
118f0 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69  ags &= ~SF_Multi
11900 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28  Value;.      if(
11910 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11920 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
11930 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
11940 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
11950 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
11960 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
11970 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
11980 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
11990 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
119a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
119b0 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c  ..  if( rHasNull
119c0 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
119d0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
119e0 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  g(v, pExpr->iTab
119f0 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  le, rHasNullFlag
11a00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d  );.  }..  if( jm
11a10 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b  pIfDynamic>=0 ){
11a20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11a30 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49  JumpHere(v, jmpI
11a40 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20  fDynamic);.  }. 
11a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11a60 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20  ePop(pParse);.. 
11a70 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
11a80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11a90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
11aa0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
11ab0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11ac0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11ad0 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
11ae0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
11af0 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
11b00 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
11b10 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
11b20 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
11b30 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
11b40 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
11b50 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
11b60 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
11b70 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
11b80 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
11b90 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
11ba0 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
11bb0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
11bc0 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
11bd0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
11be0 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
11bf0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11c00 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
11c10 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
11c20 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
11c30 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
11c40 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
11c50 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
11c60 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
11c70 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
11c80 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
11c90 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
11ca0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
11cb0 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
11cc0 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
11cd0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
11ce0 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
11cf0 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
11d00 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
11d10 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
11d20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
11d30 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
11d40 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
11d50 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
11d60 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
11d70 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
11d80 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
11d90 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
11da0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11db0 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
11dc0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11dd0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
11de0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
11df0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
11e00 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
11e10 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
11e20 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
11e30 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
11e40 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
11e50 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
11e60 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
11e70 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
11e80 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
11e90 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
11ea0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
11eb0 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
11ec0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
11ed0 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
11ee0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
11ef0 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
11f00 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
11f10 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
11f20 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
11f30 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
11f40 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
11f50 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
11f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
11f70 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
11f80 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
11f90 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
11fa0 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
11fb0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11fd0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
11fe0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
11ff0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
12000 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
12010 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
12020 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
12030 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
12040 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
12050 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
12060 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
12070 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
12080 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
12090 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
120a0 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
120b0 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
120c0 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
120d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
120e0 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
120f0 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
12100 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
12110 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
12120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
12140 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
12150 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
12160 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
12190 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
121a0 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
121b0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
121c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
121d0 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
121e0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
121f0 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
12200 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
12210 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
12220 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
12230 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
12240 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
12250 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
12260 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
12270 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
12280 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
12290 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
122a0 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
122b0 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
122c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
122d0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
122e0 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
122f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12300 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
12310 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12320 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
12330 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
12340 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
12350 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
12360 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
12370 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
12380 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
12390 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
123a0 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
123b0 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
123c0 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
123d0 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  risons..  */.  i
123e0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
123f0 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
12400 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
12410 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
12420 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
12430 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
12440 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
12450 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
12460 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
12470 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12480 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
12490 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
124a0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
124b0 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
124c0 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
124d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
124e0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
124f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
12500 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
12510 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
12520 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
12530 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12540 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
12550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12560 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
12570 72 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c  r1, r1, regCkNul
12580 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
12590 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
125a0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
125b0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
125c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
125d0 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
125e0 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
125f0 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
12600 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
12610 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
12620 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
12630 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
12640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12650 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
12660 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
12670 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
12680 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12690 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
126a0 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
126b0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
126c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
126d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
126e0 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c  Eq, r1, labelOk,
126f0 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
12710 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
12720 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
12730 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
12740 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
12750 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
12760 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
12770 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
12780 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
12790 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
127a0 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 29 3b  P5(v, affinity);
127b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
127c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
127d0 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
127e0 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
127f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12800 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c  p4(v, OP_Ne, r1,
12810 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
12820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12830 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
12840 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
12850 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
12860 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
12870 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12880 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 20  eP5(v, affinity 
12890 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
128a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
128b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
128c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
128d0 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
128e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
128f0 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
12900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12910 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
12920 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
12930 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
12940 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
12950 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
12960 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
12970 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12980 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12990 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
129a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
129b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
129c0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65  regCkNull);.  }e
129d0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  lse{.  .    /* I
129e0 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
129f0 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
12a00 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c  lt is either fal
12a10 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e  se or NULL depen
12a20 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77  ding.    ** on w
12a30 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20 69  hether the RHS i
12a40 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20  s empty or not, 
12a50 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
12a60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
12a70 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
12a80 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  l(pExpr->pLeft) 
12a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  ){.      if( des
12aa0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
12ab0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
12ac0 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
12ad0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
12ae0 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65 20  where the false 
12af0 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65  and NULL outcome
12b00 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
12b10 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
12b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12b30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
12b40 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66  Null, r1, destIf
12b50 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
12b60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
12b70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
12b80 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
12b90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12ba0 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56  _NotNull, r1); V
12bb0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12be0 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
12bf0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
12c00 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
12c10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12c30 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 4e  eGoto(v, destIfN
12c40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
12c50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12c60 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
12c70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12c80 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
12c90 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
12ca0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
12cb0 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73  case, the RHS is
12cc0 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61   the ROWID of ta
12cd0 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20  ble b-tree.     
12ce0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12d00 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c  P_MustBeInt, r1,
12d10 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56   destIfFalse); V
12d20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12d40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
12d50 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e  tExists, pExpr->
12d60 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
12d70 6c 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  lse, r1);.      
12d80 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12d90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12da0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
12db0 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e  e, the RHS is an
12dc0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20   index b-tree.. 
12dd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
12de0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12df0 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
12e00 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e  r1, 1, 0, &affin
12e10 69 74 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20  ity, 1);.  .    
12e20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20    /* If the set 
12e30 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20  membership test 
12e40 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
12e50 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20  result of the . 
12e60 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e       ** "x IN (.
12e70 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20  ..)" expression 
12e80 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30  must be either 0
12e90 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65   or NULL. If the
12ea0 20 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f   set.      ** co
12eb0 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
12ec0 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
12ed0 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
12ee0 74 68 65 20 73 65 74 20 0a 20 20 20 20 20 20 2a  the set .      *
12ef0 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  * contains one o
12f00 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
12f10 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
12f20 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ult of the.     
12f30 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
12f40 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20  s also NULL..   
12f50 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
12f60 72 74 28 20 64 65 73 74 49 66 46 61 6c 73 65 21  rt( destIfFalse!
12f70 3d 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72  =destIfNull || r
12f80 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b  RhsHasNull==0 );
12f90 0a 20 20 20 20 20 20 69 66 28 20 72 52 68 73 48  .      if( rRhsH
12fa0 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  asNull==0 ){.   
12fb0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
12fc0 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
12fd0 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
12fe0 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
12ff0 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20   RHS.        ** 
13000 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e  cannot contain N
13010 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73  ULL values. This
13020 20 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20   happens as the 
13030 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a  result.        *
13040 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
13050 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
13060 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
13070 65 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ema..        **.
13080 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20          ** Also 
13090 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20  run this branch 
130a0 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76  if NULL is equiv
130b0 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20  alent to FALSE. 
130c0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
130d0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e  is particular IN
130e0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20   operator..     
130f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
13100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
13110 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
13120 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
13130 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
13140 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 1);.        V
13150 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13170 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
13180 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20  branch, the RHS 
13190 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20  of the IN might 
131a0 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61  contain a NULL a
131b0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  nd.        ** th
131c0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20  e presence of a 
131d0 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20  NULL on the RHS 
131e0 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e  makes a differen
131f0 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ce in the.      
13200 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20    ** outcome..  
13210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13220 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 0a 20   int addr1;.  . 
13230 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
13240 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
13250 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
13260 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
13270 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20    If so,.       
13280 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73   ** then the ans
13290 77 65 72 20 69 73 20 54 52 55 45 20 74 68 65 20  wer is TRUE the 
132a0 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
132b0 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
132c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  s.        ** not
132d0 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68 65   matter.  If the
132e0 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
132f0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
13300 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
13310 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20     ** answer is 
13320 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
13330 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61  contains NULLs a
13340 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  nd the answer is
13350 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53  .        ** FALS
13360 45 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  E if the RHS is 
13370 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20  NULL-free..     
13380 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64     */.        ad
13390 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
133a0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
133b0 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
133c0 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
133d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
133e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
133f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13400 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
13410 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
13420 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
13430 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
13440 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
13450 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
13460 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
13470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13480 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13490 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
134a0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
134b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
134c0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
134d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
134e0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64  op(pParse);.  Vd
134f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
13500 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d  nd IN expr"));.}
13510 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13520 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
13530 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
13540 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13550 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e  _POINT./*.** Gen
13560 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
13570 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
13580 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
13590 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
135a0 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
135b0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
135c0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
135d0 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
135e0 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
135f0 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
13600 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
13610 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
13620 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
13630 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
13640 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
13650 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
13660 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
13670 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
13680 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
13690 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
136a0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65   char *z, int ne
136b0 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d  gateFlag, int iM
136c0 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  em){.  if( ALWAY
136d0 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64  S(z!=0) ){.    d
136e0 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
136f0 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
13700 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53  &value, sqlite3S
13710 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
13720 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73  TE_UTF8);.    as
13730 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
13740 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a  NaN(value) ); /*
13750 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65   The new AtoF ne
13760 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20  ver returns NaN 
13770 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74  */.    if( negat
13780 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
13790 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69  -value;.    sqli
137a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
137b0 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  8(v, OP_Real, 0,
137c0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
137d0 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b  value, P4_REAL);
137e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
137f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
13800 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
13810 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
13820 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
13830 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
13840 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
13850 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
13860 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
13870 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
13880 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
13890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
138a0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
138b0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
138c0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
138d0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
138e0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
138f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
13900 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
13910 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
13920 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
13930 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
13940 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
13950 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
13960 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
13970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13980 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13990 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
139a0 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
139b0 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
139c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
139d0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
139e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
139f0 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
13a00 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
13a10 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
13a20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28     if( c==0 || (
13a30 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29  c==2 && negFlag)
13a40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
13a50 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
13a60 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
13a70 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
13a80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13a90 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
13aa0 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
13ab0 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
13ac0 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  lue, P4_INT64);.
13ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
13ae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
13af0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
13b00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13b10 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72  sg(pParse, "over
13b20 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25  sized integer: %
13b30 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20  s%s", negFlag ? 
13b40 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65  "-" : "", z);.#e
13b50 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  lse.#ifndef SQLI
13b60 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45  TE_OMIT_HEX_INTE
13b70 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71  GER.      if( sq
13b80 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
13b90 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"0x",2)==0 ){. 
13ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
13bb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13bc0 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20  hex literal too 
13bd0 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  big: %s", z);.  
13be0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
13bf0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
13c00 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20   codeReal(v, z, 
13c10 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
13c20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13c30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13c40 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20  * Clear a cache 
13c50 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
13c60 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79   void cacheEntry
13c70 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
13c80 72 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c  rse, struct yCol
13c90 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28  Cache *p){.  if(
13ca0 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20   p->tempReg ){. 
13cb0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
13cc0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
13cd0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
13ce0 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eg) ){.      pPa
13cf0 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50  rse->aTempReg[pP
13d00 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b  arse->nTempReg++
13d10 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  ] = p->iReg;.   
13d20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65   }.    p->tempRe
13d30 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  g = 0;.  }.}.../
13d40 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74  *.** Record in t
13d50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
13d60 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61  that a particula
13d70 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a  r column from a.
13d80 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61  ** particular ta
13d90 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
13da0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
13db0 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  gister..*/.void 
13dc0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
13dd0 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61  Store(Parse *pPa
13de0 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69  rse, int iTab, i
13df0 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65  nt iCol, int iRe
13e00 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
13e10 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74  nt minLru;.  int
13e20 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63   idxLru;.  struc
13e30 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
13e40 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20  .  /* Unless an 
13e50 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
13e60 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ed, register num
13e70 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
13e80 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61  positive. */.  a
13e90 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c  ssert( iReg>0 ||
13ea0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
13eb0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13ec0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
13ed0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20  ssert( iCol>=-1 
13ee0 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b  && iCol<32768 );
13ef0 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75    /* Finite colu
13f00 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  mn numbers */.. 
13f10 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43   /* The SQLITE_C
13f20 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20  olumnCache flag 
13f30 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c  disables the col
13f40 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73  umn cache.  This
13f50 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f   is used.  ** fo
13f60 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d  r testing only -
13f70 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
13f80 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65  SQLite always ge
13f90 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ts the same answ
13fa0 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64  er.  ** with and
13fb0 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c   without the col
13fc0 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  umn cache..  */.
13fd0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
13fe0 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73  onDisabled(pPars
13ff0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
14000 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74  lumnCache) ) ret
14010 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  urn;..  /* First
14020 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
14030 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a  sting entry..  *
14040 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
14050 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c   the way the col
14060 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72  umn cache is cur
14070 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20  rently used, we 
14080 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20  are guaranteed. 
14090 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a   ** that the obj
140a0 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  ect will never a
140b0 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63  lready be in cac
140c0 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73  he.  Verify this
140d0 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f   guarantee..  */
140e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
140f0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14100 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14110 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14120 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
14130 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
14140 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61  Reg==0 || p->iTa
14150 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
14160 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
14170 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14180 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
14190 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
141a0 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
141b0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
141c0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
141d0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
141e0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
141f0 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
14200 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
14210 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14220 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
14230 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
14240 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
14250 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
14260 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
14270 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
14280 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
14290 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
142a0 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
142b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
142c0 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c  /* Replace the l
142d0 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65  ast recently use
142e0 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20  d */.  minLru = 
142f0 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64  0x7fffffff;.  id
14300 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  xLru = -1;.  for
14310 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14320 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14330 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
14340 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14350 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75  f( p->lru<minLru
14360 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75   ){.      idxLru
14370 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c   = i;.      minL
14380 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20  ru = p->lru;.   
14390 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57   }.  }.  if( ALW
143a0 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29  AYS(idxLru>=0) )
143b0 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
143c0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78  e->aColCache[idx
143d0 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65  Lru];.    p->iLe
143e0 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
143f0 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70  acheLevel;.    p
14400 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
14410 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
14420 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69  = iCol;.    p->i
14430 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
14440 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
14450 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
14460 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
14470 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
14480 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  }.}../*.** Indic
14490 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65  ate that registe
144a0 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e  rs between iReg.
144b0 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65  .iReg+nReg-1 are
144c0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
144d0 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  en..** Purge the
144e0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
144f0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ers from the col
14500 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f  umn cache..*/.vo
14510 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
14520 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20  cheRemove(Parse 
14530 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
14540 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
14550 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61  int i;.  int iLa
14560 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67  st = iReg + nReg
14570 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79   - 1;.  struct y
14580 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
14590 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
145a0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
145b0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
145c0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
145d0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
145e0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65  ;.    if( r>=iRe
145f0 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b  g && r<=iLast ){
14600 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
14610 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
14620 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
14630 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
14640 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
14650 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
14660 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65  lumn cache conte
14670 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74  xt.  Any new ent
14680 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64  ries added.** ad
14690 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  ded to the colum
146a0 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  n cache after th
146b0 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f  is call are remo
146c0 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ved when the.** 
146d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
146e0 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  p occurs..*/.voi
146f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
14700 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  hePush(Parse *pP
14710 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
14720 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a  >iCacheLevel++;.
14730 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
14740 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
14750 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
14760 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
14770 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
14780 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22  f("PUSH to %d\n"
14790 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
147a0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
147b0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
147c0 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  ve from the colu
147d0 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74  mn cache any ent
147e0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61  ries that were a
147f0 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a  dded since the.*
14800 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  * the previous s
14810 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14820 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ush operation.  
14830 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
14840 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63  restore.** the c
14850 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74  ache to the stat
14860 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f  e it was in prio
14870 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
14880 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20  t Push..*/.void 
14890 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
148a0 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
148b0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
148c0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
148d0 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  *p;.  assert( pP
148e0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
148f0 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65  l>=1 );.  pParse
14900 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b  ->iCacheLevel--;
14910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
14920 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
14930 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
14940 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
14950 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
14960 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e  tf("POP  to %d\n
14970 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
14980 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
14990 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
149a0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
149b0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
149c0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
149d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
149e0 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c  Reg && p->iLevel
149f0 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c  >pParse->iCacheL
14a00 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  evel ){.      ca
14a10 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
14a20 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
14a30 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
14a40 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14a50 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f  When a cached co
14a60 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20  lumn is reused, 
14a70 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69  make sure that i
14a80 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a  ts register is.*
14a90 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69  * no longer avai
14aa0 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20  lable as a temp 
14ab0 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65  register.  ticke
14ac0 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73  t #3879:  that s
14ad0 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ame.** register 
14ae0 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20  might be in the 
14af0 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c  cache in multipl
14b00 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20  e places, so be 
14b10 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74  sure to.** get t
14b20 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  hem all..*/.stat
14b30 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
14b40 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
14b50 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
14b60 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
14b70 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14b80 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
14b90 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
14ba0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
14bb0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14bc0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14bd0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
14be0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Reg ){.      p->
14bf0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
14c00 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e   }.  }.}../* Gen
14c10 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
14c20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72  will load into r
14c30 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61  egister regOut a
14c40 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a   value that is.*
14c50 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  * appropriate fo
14c60 72 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68  r the iIdxCol-th
14c70 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
14c80 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73   pIdx..*/.void s
14c90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f  qlite3ExprCodeLo
14ca0 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20  adIndexColumn(. 
14cb0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14cc0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14cd0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
14ce0 65 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20  ex *pIdx,    /* 
14cf0 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
14d00 63 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20  column is to be 
14d10 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  loaded */.  int 
14d20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43  iTabCur,    /* C
14d30 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
14d40 6f 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f  o a table row */
14d50 0a 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20  .  int iIdxCol, 
14d60 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
14d70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
14d80 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
14d90 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
14da0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64  /* Store the ind
14db0 65 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  ex column value 
14dc0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
14dd0 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61   */.){.  i16 iTa
14de0 62 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  bCol = pIdx->aiC
14df0 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a  olumn[iIdxCol];.
14e00 20 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58    if( iTabCol==X
14e10 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73  N_EXPR ){.    as
14e20 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
14e30 45 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65  Expr );.    asse
14e40 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
14e50 70 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f  pr->nExpr>iIdxCo
14e60 6c 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  l );.    pParse-
14e70 3e 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62  >iSelfTab = iTab
14e80 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Cur;.    sqlite3
14e90 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
14ea0 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
14eb0 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
14ec0 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
14ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
14ee0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
14ef0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61  olumnOfTable(pPa
14f00 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78  rse->pVdbe, pIdx
14f10 2d 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75  ->pTable, iTabCu
14f20 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20         iTabCol, 
14f50 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
14f60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14f70 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
14f80 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
14f90 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
14fa0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
14fb0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
14fc0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
14fd0 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
14fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
14ff0 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
15000 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
15010 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
15020 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
15030 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
15040 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
15050 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
15060 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
15070 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
15080 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
15090 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
150a0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
150b0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
150c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
150d0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
150e0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
150f0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
15100 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30  .){.  if( iCol<0
15110 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
15120 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
15130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15140 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
15150 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
15160 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
15170 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
15180 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
15190 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
151a0 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a    int x = iCol;.
151b0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
151c0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
151d0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
151e0 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
151f0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
15200 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
15210 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15220 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
15230 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
15240 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
15250 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
15260 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
15270 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
15280 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
15290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
152a0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
152b0 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
152c0 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
152d0 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
152e0 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
152f0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
15300 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a   a register. .**
15310 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73  .** An effort is
15320 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
15330 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
15340 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
15350 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  .  This.** is no
15360 74 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72  t garanteeed for
15370 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74   GetColumn() - t
15380 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65  he result can be
15390 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e   stored in.** an
153a0 79 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74  y register.  But
153b0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67   the result is g
153c0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e  uaranteed to lan
153d0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  d in register iR
153e0 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c  eg.** for GetCol
153f0 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a  umnToReg()..**.*
15400 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
15410 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
15420 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
15430 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
15440 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
15450 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
15460 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
15470 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
15480 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
15490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
154a0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
154b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
154c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
154d0 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
154e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
154f0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
15500 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
15510 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
15520 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
15530 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
15540 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
15550 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
15560 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
15570 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
15580 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
15590 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
155a0 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
155b0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
155c0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
155d0 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
155e0 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
155f0 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53  P_Column + FLAGS
15600 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
15610 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15620 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
15630 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
15640 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
15650 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
15660 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
15670 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
15680 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
15690 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c  eg>0 && p->iTabl
156a0 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
156b0 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
156c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
156d0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
156e0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
156f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
15700 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
15710 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
15720 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
15730 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
15740 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
15750 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15760 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
15770 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c  e(v, pTab, iTabl
15780 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
15790 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20  );.  if( p5 ){. 
157a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
157b0 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
157c0 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73   }else{   .    s
157d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
157e0 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61  tore(pParse, iTa
157f0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
15800 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eg);.  }.  retur
15810 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73  n iReg;.}.void s
15820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
15830 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20  tColumnToReg(.  
15840 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15850 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
15860 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
15870 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
15880 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
15890 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
158a0 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
158b0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
158c0 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
158d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
158e0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
158f0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
15900 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
15910 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
15920 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
15930 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
15940 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
15950 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
15960 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45  nt r1 = sqlite3E
15970 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
15980 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
15990 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20  Column, iTable, 
159a0 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  iReg, 0);.  if( 
159b0 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74  r1!=iReg ) sqlit
159c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
159d0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
159e0 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b  Copy, r1, iReg);
159f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  .}.../*.** Clear
15a00 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
15a10 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
15a20 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
15a30 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
15a40 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
15a50 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
15a60 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51  ache *p;..#if SQ
15a70 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
15a80 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
15a90 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15aa0 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15ab0 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
15ac0 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
15ad0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
15ae0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
15af0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
15b00 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
15b10 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
15b20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
15b30 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
15b40 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
15b50 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
15b60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  }.}../*.** Recor
15b70 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
15b80 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
15b90 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
15ba0 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
15bb0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
15bc0 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
15bd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
15be0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
15bf0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
15c00 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
15c10 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
15c20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
15c30 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
15c40 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
15c50 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15c60 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
15c70 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
15c80 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
15c90 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
15ca0 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
15cb0 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
15cc0 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
15cd0 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
15ce0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
15cf0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
15d00 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
15d10 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
15d20 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
15d30 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
15d40 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
15d50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15d60 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
15d70 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
15d80 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
15d90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15da0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
15db0 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d   iFrom, nReg);.}
15dc0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
15dd0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
15de0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
15df0 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
15e00 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
15e10 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
15e20 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
15e30 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
15e40 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
15e50 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
15e60 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
15e70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15e80 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
15e90 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
15ea0 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
15eb0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
15ec0 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
15ed0 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
15ee0 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
15ef0 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
15f00 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
15f10 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
15f20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
15f30 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
15f40 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
15f50 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
15f60 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
15f70 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
15f80 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
15f90 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
15fa0 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
15fb0 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
15fc0 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
15fd0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
15fe0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
15ff0 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
16000 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f  ERAGE_TEST */../
16010 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
16020 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
16030 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
16040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16050 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
16060 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67  xpr *p, int iReg
16070 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d  ){.  p->op2 = p-
16080 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  >op;.  p->op = T
16090 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d  K_REGISTER;.  p-
160a0 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a  >iTable = iReg;.
160b0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
160c0 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b  rty(p, EP_Skip);
160d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
160e0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
160f0 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
16100 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
16110 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
16120 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
16130 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16140 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
16150 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
16160 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
16170 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
16180 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
16190 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
161a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
161b0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
161c0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
161d0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
161e0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
161f0 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
16200 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
16210 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
16220 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
16230 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
16240 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
16250 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
16260 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
16270 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
16280 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
16290 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
162a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
162b0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
162c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
162d0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
162e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
162f0 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
16300 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
16310 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
16320 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
16330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
16340 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
16350 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
16360 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
16370 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
16380 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
16390 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
163a0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
163b0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
163c0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
163d0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
163e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
163f0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
16400 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
16410 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
16420 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
16430 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
16440 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
16450 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
16460 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
16470 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16480 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
16490 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
164a0 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164c0 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
164d0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a  ession node */..
164e0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
164f0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
16500 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
16510 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
16520 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
16530 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16540 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
16550 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
16560 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
16570 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
16580 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
16590 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
165a0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
165b0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
165c0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
165d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
165e0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
165f0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
16600 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
16610 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
16620 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
16630 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
16640 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
16650 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16660 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
16670 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
16680 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
16690 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
166a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
166b0 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
166c0 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
166d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
166e0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
166f0 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
16700 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
16730 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
16740 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
16750 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16760 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
16770 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
16780 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
16790 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
167a0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
167b0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
167c0 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
167d0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
167e0 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
167f0 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  f( pParse->ckBas
16800 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
16810 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
16820 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
16830 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
16840 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
16850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
16860 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
16870 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
16880 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  kBase;.         
16890 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
168a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
168b0 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78   /* Coding an ex
168c0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
168d0 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65   part of an inde
168e0 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e  x where column n
168f0 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ames.          *
16900 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72  * in the index r
16910 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  efer to the tabl
16920 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
16930 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  ndex belongs */.
16940 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d            iTab =
16950 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
16960 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  b;.        }.   
16970 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
16980 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16990 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
169a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
169b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
169e0 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16a10 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
16a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16a30 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
16a40 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
16a50 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
16a60 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
16a70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16a80 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
16a90 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
16aa0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
16ab0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
16ac0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16ad0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16ae0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16af0 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
16b00 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
16b10 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
16b20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16b30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
16b40 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
16b50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16b60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16b70 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
16b80 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
16b90 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
16ba0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
16bb0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
16bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16bd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
16be0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
16bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16c00 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
16c10 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
16c20 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
16c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
16c40 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
16c50 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
16c60 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
16c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
16c80 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
16c90 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
16ca0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
16cb0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
16cc0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
16cd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16ce0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
16cf0 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
16d00 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
16d10 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
16d20 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
16d30 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
16d40 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
16d50 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
16d60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16d70 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
16d80 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
16d90 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
16da0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
16db0 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
16dc0 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
16dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16de0 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
16df0 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
16e00 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
16e10 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
16e20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16e30 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
16e40 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
16e50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
16e60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16e70 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
16e80 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16e90 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
16ea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16eb0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
16ec0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
16ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16ee0 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
16ef0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
16f00 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
16f10 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
16f20 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
16f30 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
16f40 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
16f50 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
16f60 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
16f70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
16f80 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
16f90 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
16fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
16fb0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
16fc0 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
16fd0 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
16fe0 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
16ff0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
17000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17010 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
17020 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
17030 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
17040 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
17050 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17060 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
17070 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
17080 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
17090 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
170a0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
170b0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
170c0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
170d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
170e0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
170f0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
17100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
17110 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
17120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17140 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
17150 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
17160 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
17170 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17190 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
171a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
171b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
171c0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
171d0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
171e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
171f0 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
17200 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
17210 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
17220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17230 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
17240 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
17250 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
17260 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
17270 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
17280 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
17290 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
172a0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
172b0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
172c0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
172d0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
172e0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72  TK_EQ: {.      r
172f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
17300 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17310 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
17320 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
17330 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
17340 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17350 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
17360 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
17370 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
17380 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17390 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
173a0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
173b0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
173c0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
173d0 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61  TOREP2);.      a
173e0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
173f0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
17400 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
17410 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
17420 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
17430 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
17440 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
17450 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
17460 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
17470 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
17480 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
17490 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
174a0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
174b0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
174c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
174d0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
174e0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
174f0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
17500 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
17510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
17520 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
17530 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
17540 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
17550 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
17560 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
17570 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
17580 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
17590 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
175a0 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
175b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
175c0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
175d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
175e0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
175f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17600 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
17610 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
17620 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
17630 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
17640 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17650 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
17660 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17670 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17680 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17690 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
176a0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
176b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
176c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
176d0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
176e0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
176f0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
17700 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
17710 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
17720 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17730 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
17740 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
17750 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
17760 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
17770 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e  OREP2 | SQLITE_N
17780 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
17790 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
177a0 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
177b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
177c0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
177d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
177e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
177f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17800 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17820 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
17830 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
17840 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
17850 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
17860 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
17870 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
17880 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
17890 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
178a0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
178b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
178c0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
178d0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
178e0 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
178f0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
17900 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17910 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
17920 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
17930 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
17940 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
17950 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
17960 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
17970 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17980 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
17990 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
179a0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
179b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
179c0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
179d0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
179e0 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
179f0 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
17a00 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
17a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17a20 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
17a30 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
17a40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
17a50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17a60 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
17a70 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
17a80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17a90 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
17aa0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
17ab0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
17ac0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17ad0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
17ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17af0 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
17b00 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
17b10 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
17b20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17b30 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
17b40 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
17b50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17b60 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
17b70 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
17b80 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
17b90 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
17ba0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
17bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17bc0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
17bd0 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
17be0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
17bf0 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
17c00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17c10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
17c20 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
17c30 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
17c40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17c50 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
17c60 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
17c70 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
17c80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17c90 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
17ca0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
17cb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17cc0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
17cd0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
17ce0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
17cf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17d00 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
17d10 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
17d20 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
17d30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17d40 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
17d50 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
17d60 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
17d70 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
17d80 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
17d90 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64  , target);.#ifnd
17da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
17db0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
17dc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
17dd0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
17de0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
17df0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
17e00 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17e10 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
17e20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
17e30 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
17e40 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65  , 1, target);.#e
17e50 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
17e60 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
17e70 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
17e80 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
17e90 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
17ea0 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
17eb0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
17ec0 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
17ed0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17ee0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17ef0 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
17f00 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
17f10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17f20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17f30 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17f40 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17f50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17f60 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
17f70 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
17f80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
17f90 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17fa0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
17fb0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
17fc0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
17fd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17fe0 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
17ff0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
18000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18010 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
18020 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
18030 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
18040 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18050 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
18060 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
18070 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
18080 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
18090 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
180a0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
180b0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
180c0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
180d0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
180e0 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
180f0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
18100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18110 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
18120 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
18130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18140 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
18150 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
18160 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
18170 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
18180 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
18190 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
181a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
181b0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
181c0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
181d0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
181e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
181f0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
18200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18210 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
18220 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
18230 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
18240 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
18250 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18260 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
18280 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
18290 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
182a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
182b0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
182c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
182d0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
182e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
182f0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
18300 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
18310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18320 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18330 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
18340 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18350 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
18360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18370 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
18380 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
18390 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
183a0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
183b0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
183c0 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
183d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
183e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
183f0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
18400 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
18410 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18420 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
18430 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
18440 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
18450 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
18460 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
18470 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
18480 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
18490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
184a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
184b0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
184c0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
184d0 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
184e0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
184f0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
18500 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
18510 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
18520 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
18530 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
18540 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
18550 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
18560 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
18570 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
18580 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
18590 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
185a0 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
185b0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
185c0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
185d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
185e0 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
185f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
18600 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
18610 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
18620 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
18630 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
18640 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
18650 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18670 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18680 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
18690 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
186a0 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
186b0 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
186c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
186d0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
186e0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
186f0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18700 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
18710 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18720 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
18730 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
18740 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
18750 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18760 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
18770 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
18780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18790 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
187a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
187b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
187c0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
187d0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
187e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
187f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18800 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
18810 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
18820 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
18830 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
18840 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
18850 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
18860 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
18870 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64  ion(db, zId, nId
18880 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
18890 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
188a0 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 75  ==0 || pDef->xFu
188b0 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc==0 ){.       
188c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
188d0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
188e0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  n function: %.*s
188f0 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
18900 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18910 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
18920 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
18930 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
18940 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
18950 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
18960 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
18970 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
18980 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
18990 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
189a0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
189b0 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
189c0 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
189d0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
189e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
189f0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18a00 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
18a10 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
18a20 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
18a30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18a40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
18a50 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
18a60 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
18a70 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
18a80 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
18a90 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
18aa0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
18ab0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
18ac0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18ae0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
18af0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
18b00 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
18b10 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18b30 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
18b40 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
18b50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18b60 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18b70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18b80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18b90 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
18ba0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
18bb0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
18bc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18bd0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
18be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18bf0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18c00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
18c10 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
18c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18c30 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
18c40 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
18c50 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
18c60 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
18c70 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
18c80 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
18c90 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
18ca0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
18cb0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
18cc0 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
18cd0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
18ce0 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
18cf0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
18d00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18d10 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
18d20 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
18d30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
18d40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18d50 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
18d60 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
18d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33  .        if( i<3
18d80 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  2 && sqlite3Expr
18d90 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67  IsConstant(pFarg
18da0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
18db0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
18dc0 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20  ase( i==31 );.  
18dd0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
18de0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69  k |= MASKBIT32(i
18df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18e00 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
18e10 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
18e20 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
18e30 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
18e40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
18e50 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
18e60 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18e70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
18e80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18e90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18ea0 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Farg ){.        
18eb0 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b  if( constMask ){
18ec0 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
18ed0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18ee0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
18ef0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b  ->nMem += nFarg;
18f00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18f10 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73            r1 = s
18f20 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
18f30 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67  ge(pParse, nFarg
18f40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
18f50 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e        /* For len
18f60 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66  gth() and typeof
18f70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74  () functions wit
18f80 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d  h a column argum
18f90 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent,.        ** 
18fa0 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d  set the P5 param
18fb0 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43  eter to the OP_C
18fc0 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20  olumn opcode to 
18fd0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
18fe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f  .        ** or O
18ff0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
19000 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f  respectively, to
19010 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
19020 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20  ry data.        
19030 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20  ** loading..    
19040 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
19050 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
19060 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
19070 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45  NC_LENGTH|SQLITE
19080 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d  _FUNC_TYPEOF))!=
19090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
190a0 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20  8 exprOp;.      
190b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
190c0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
190d0 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d    assert( pFarg-
190e0 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29  >a[0].pExpr!=0 )
190f0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72  ;.          expr
19100 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  Op = pFarg->a[0]
19110 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20  .pExpr->op;.    
19120 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70        if( exprOp
19130 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65  ==TK_COLUMN || e
19140 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  xprOp==TK_AGG_CO
19150 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
19160 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
19170 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d  TE_FUNC_LENGTH==
19180 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
19190 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
191a0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
191b0 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c  UNC_TYPEOF==OPFL
191c0 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a  AG_TYPEOFARG );.
191d0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
191e0 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63  case( pDef->func
191f0 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c  Flags & OPFLAG_L
19200 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
19210 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61          pFarg->a
19220 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d  [0].pExpr->op2 =
19230 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19240 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c      pDef->funcFl
19250 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45  ags & (OPFLAG_LE
19260 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54  NGTHARG|OPFLAG_T
19270 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20  YPEOFARG);.     
19280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19290 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
192a0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
192b0 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54  Parse);     /* T
192c0 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
192d0 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  be */.        sq
192e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
192f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46  rList(pParse, pF
19300 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20  arg, r1, 0,.    
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
19330 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
19340 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
19350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19360 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
19370 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
19380 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
19390 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
193a0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
193b0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
193c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
193d0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
193e0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
193f0 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
19400 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
19410 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
19420 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
19430 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
19440 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
19450 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
19460 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
19470 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
19480 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
19490 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
194a0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
194b0 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
194c0 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
194d0 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
194e0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
194f0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
19500 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
19510 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
19520 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
19530 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
19540 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
19550 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
19560 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
19570 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
19580 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
19590 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
195a0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
195b0 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
195c0 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
195d0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
195e0 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
195f0 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
19600 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
19610 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
19620 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
19630 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
19640 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
19650 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
19660 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
19670 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
19680 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
19690 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
196a0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
196b0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
196c0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
196d0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
196e0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
196f0 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
19700 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
19710 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
19720 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
19730 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
19740 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
19750 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
19760 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
19770 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
19780 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
19790 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
197a0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
197b0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
197c0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
197d0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
197e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
197f0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
19800 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
19810 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
19820 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
19830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19840 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
19850 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  ion0, constMask,
19860 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
19890 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
198a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
198b0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
198c0 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
198d0 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
198e0 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
198f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19900 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
19910 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
19920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
19930 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
19940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19950 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
19960 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
19970 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
19980 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19990 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
199a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
199b0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
199c0 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
199d0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
199e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
199f0 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
19a00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19a10 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
19a20 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
19a30 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
19a40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19a50 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
19a60 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
19a70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19a90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19aa0 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
19ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19ac0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
19ad0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
19ae0 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
19af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19b00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19b10 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
19b20 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
19b30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19b40 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
19b50 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19b60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19b70 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
19b80 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
19b90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
19ba0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
19bb0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
19bc0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
19bd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
19be0 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
19bf0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
19c00 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
19c10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
19c20 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
19c30 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
19c40 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
19c50 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
19c60 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
19c70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
19c80 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
19c90 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
19ca0 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
19cb0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
19cc0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
19cd0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
19ce0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
19cf0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
19d00 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
19d10 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
19d20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
19d30 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
19d40 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
19d50 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
19d60 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
19d70 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
19d80 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
19d90 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19da0 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
19db0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
19dc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19dd0 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
19de0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
19df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
19e00 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
19e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
19e20 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
19e30 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
19e40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19e50 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
19e60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19e70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
19e80 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
19e90 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
19ea0 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
19eb0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
19ec0 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
19ed0 4f 52 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76  OREP2);  VdbeCov
19ee0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19ef0 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
19f00 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
19f10 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
19f20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19f30 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
19f40 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
19f50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19f60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
19f70 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
19f80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19f90 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
19fa0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
19fb0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
19fc0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
19fd0 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
19fe0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
19ff0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a000 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1a010 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a020 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
1a030 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
1a040 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a050 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
1a060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1a070 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a080 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
1a090 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a0a0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
1a0b0 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
1a0c0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
1a0d0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1a0e0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1a0f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1a100 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
1a110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a120 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
1a130 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
1a140 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
1a150 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
1a160 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
1a170 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
1a180 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
1a190 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1a1a0 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
1a1b0 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
1a1c0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
1a1d0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
1a1e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
1a1f0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
1a200 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
1a210 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
1a220 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
1a230 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
1a240 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
1a250 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
1a260 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
1a270 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
1a280 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
1a290 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
1a2a0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
1a2b0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
1a2c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a2d0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1a2e0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
1a2f0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
1a300 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
1a310 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
1a320 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
1a330 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
1a340 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
1a350 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
1a360 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
1a370 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
1a380 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
1a390 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
1a3a0 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
1a3b0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
1a3c0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
1a3d0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
1a3e0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
1a3f0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
1a400 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
1a410 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
1a420 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
1a430 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
1a440 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1a450 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
1a460 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
1a470 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
1a480 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
1a490 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
1a4a0 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
1a4b0 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
1a4c0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
1a4d0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1a4e0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
1a4f0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
1a500 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
1a510 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
1a520 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
1a530 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
1a540 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
1a550 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1a560 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
1a570 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
1a580 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
1a590 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
1a5a0 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
1a5b0 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
1a5c0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
1a5d0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
1a5e0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
1a5f0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
1a600 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
1a610 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
1a620 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
1a630 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
1a640 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
1a650 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1a660 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
1a670 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
1a680 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
1a690 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
1a6a0 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
1a6b0 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
1a6c0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
1a6d0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
1a6e0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1a6f0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1a700 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
1a710 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1a720 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
1a730 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
1a740 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
1a750 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
1a760 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
1a770 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
1a780 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
1a790 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
1a7a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7b0 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
1a7c0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1a7d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a7e0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
1a7f0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
1a800 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
1a810 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
1a820 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
1a830 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
1a840 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
1a850 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
1a860 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
1a870 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
1a880 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
1a890 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1a8a0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
1a8b0 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
1a8c0 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
1a8d0 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
1a8e0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
1a8f0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
1a900 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
1a910 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
1a920 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
1a930 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a  ly real..      *
1a940 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
1a950 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d  NCE-OF: R-60985-
1a960 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c  57662 SQLite wil
1a970 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61  l convert the va
1a980 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20  lue back to.    
1a990 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
1a9a0 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74  int when extract
1a9b0 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ing it from the 
1a9c0 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20  record.  */.    
1a9d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1a9e0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
1a9f0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
1aa00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
1aa10 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
1aa20 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
1aa30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aa40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1aa50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
1aa60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1aa70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1aa80 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1aa90 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
1aaa0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
1aab0 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
1aac0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
1aad0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
1aae0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1aaf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1ab00 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
1ab10 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
1ab20 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
1ab30 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
1ab40 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
1ab50 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
1ab60 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
1ab70 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
1ab80 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
1ab90 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
1aba0 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
1abb0 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
1abc0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
1abd0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
1abe0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
1abf0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
1ac00 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
1ac10 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
1ac20 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
1ac30 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
1ac40 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
1ac50 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
1ac60 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
1ac70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1ac80 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
1ac90 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
1aca0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
1acb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1acc0 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
1acd0 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
1ace0 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
1acf0 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
1ad00 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
1ad10 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
1ad20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
1ad30 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
1ad40 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
1ad50 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
1ad60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ad70 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
1ad80 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
1ad90 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
1ada0 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
1adb0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
1adc0 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
1add0 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
1ade0 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
1adf0 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
1ae00 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
1ae10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
1ae20 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
1ae30 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
1ae40 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
1ae50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ae60 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
1ae70 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
1ae80 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
1ae90 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
1aec0 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
1aed0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1aee0 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
1af10 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
1af20 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1af50 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1af60 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1af70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1af80 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
1af90 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
1afa0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1afb0 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
1afc0 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
1afd0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1afe0 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
1aff0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1b000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
1b010 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
1b020 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b050 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
1b060 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
1b070 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1b080 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
1b090 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
1b0a0 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
1b0b0 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
1b0c0 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
1b0d0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1b0e0 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
1b0f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1b100 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1b110 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
1b120 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
1b130 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b140 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
1b150 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
1b160 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
1b170 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
1b180 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
1b190 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
1b1a0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
1b1b0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
1b1c0 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
1b1d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b1e0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
1b1f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
1b200 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
1b210 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
1b220 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
1b230 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1b240 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
1b250 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73  gister(&tempX, s
1b260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1b270 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
1b280 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
1b290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1b2a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1b2b0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
1b2c0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
1b2d0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
1b2e0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
1b2f0 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
1b300 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
1b310 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
1b320 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
1b330 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
1b340 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
1b350 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
1b360 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
1b370 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
1b380 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
1b390 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
1b3a0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1b3b0 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
1b3c0 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
1b3d0 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
1b3e0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
1b3f0 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
1b400 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
1b410 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
1b420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b430 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1b440 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
1b450 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b460 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1b470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
1b480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1b490 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
1b4a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
1b4b0 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
1b4c0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
1b4d0 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
1b4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
1b4f0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
1b500 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1b510 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
1b520 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1b530 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b550 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
1b560 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
1b570 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1b580 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
1b590 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
1b5a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1b5b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b5c0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
1b5d0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
1b5e0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
1b5f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b600 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
1b610 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
1b620 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1b630 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b640 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
1b650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b660 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1b670 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b680 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b690 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
1b6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b6b0 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20  f( (nExpr&1)!=0 
1b6c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b6d0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1b6e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1b6f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b700 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
1b710 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
1b720 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1b730 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b740 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1b750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b770 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1b780 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1b790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1b7a0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1b7b0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
1b7c0 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
1b7d0 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
1b7e0 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
1b7f0 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
1b800 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b810 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1b820 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
1b830 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1b840 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1b850 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1b860 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1b870 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b880 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
1b890 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
1b8a0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
1b8b0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
1b8c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1b8d0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b8e0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
1b8f0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1b900 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
1b910 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
1b920 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
1b930 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
1b940 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b950 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
1b980 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
1b990 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
1b9a0 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
1b9b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1b9c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
1b9d0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1b9e0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
1b9f0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
1ba00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1ba10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1ba20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1ba30 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1ba40 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
1ba50 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1ba60 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
1ba70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ba80 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
1ba90 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
1baa0 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
1bab0 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
1bac0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
1bad0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1bae0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
1baf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1bb00 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
1bb10 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
1bb20 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
1bb30 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
1bb60 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
1bb70 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
1bb80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
1bb90 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1bba0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1bbb0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1bbc0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1bbd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bbe0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bbf0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
1bc00 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
1bc10 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
1bc20 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
1bc30 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
1bc40 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
1bc50 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
1bc60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1bc70 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
1bc80 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
1bc90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1bca0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
1bcb0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1bcc0 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
1bcd0 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
1bce0 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
1bcf0 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20 20  t regDest,      
1bd00 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
1bd10 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1bd20 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73  ter */.  u8 reus
1bd30 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72  able       /* Tr
1bd40 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65  ue if this expre
1bd50 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c  ssion is reusabl
1bd60 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  e */.){.  ExprLi
1bd70 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
1bd80 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
1bd90 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
1bda0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1bdb0 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  pr;.  pExpr = sq
1bdc0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
1bdd0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
1bde0 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
1bdf0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1be00 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
1be10 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1be20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1be30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1be40 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
1be50 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
1be60 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20  u.iConstExprReg 
1be70 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20  = regDest;.     
1be80 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
1be90 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a  = reusable;.  }.
1bea0 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
1beb0 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  Expr = p;.}../*.
1bec0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1bed0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
1bee0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
1bef0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1bf00 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
1bf10 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
1bf20 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1bf30 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
1bf40 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
1bf50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1bf60 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1bf70 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1bf80 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
1bf90 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
1bfa0 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
1bfb0 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
1bfc0 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
1bfd0 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
1bfe0 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
1bff0 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
1c000 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ero..**.** If pE
1c010 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
1c020 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1c030 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72  tine might gener
1c040 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65  ate this.** code
1c050 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67   to fill the reg
1c060 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69  ister in the ini
1c070 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74  tialization sect
1c080 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
1c090 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f  BE program, in o
1c0a0 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69  rder to factor i
1c0b0 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61  t out of the eva
1c0c0 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f  luation loop..*/
1c0d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1c0e0 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
1c0f0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c100 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
1c110 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78  .  int r2;.  pEx
1c120 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1c130 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
1c140 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
1c150 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
1c160 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
1c170 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
1c180 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1c190 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
1c1a0 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
1c1b0 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50  ExprList *p = pP
1c1c0 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1c1d0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1c1e0 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20   *pReg  = 0;.   
1c1f0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1c200 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c210 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c220 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
1c230 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
1c240 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
1c250 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1c260 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
1c270 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
1c280 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
1c290 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
1c2a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1c2b0 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
1c2c0 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
1c2d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c2e0 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50   }.    r2 = ++pP
1c2f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1c300 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1c310 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1c320 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d  xpr, r2, 1);.  }
1c330 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
1c340 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1c350 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1c360 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1c370 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1c380 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
1c390 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
1c3a0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
1c3b0 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
1c3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1c3d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c3e0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
1c3f0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1c400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
1c410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c420 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c430 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
1c440 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
1c450 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1c460 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1c470 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1c480 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
1c490 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
1c4a0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
1c4b0 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
1c4c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
1c4d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1c4e0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1c4f0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
1c500 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
1c510 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
1c520 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
1c530 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
1c540 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
1c550 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
1c560 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c570 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1c580 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
1c590 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
1c5a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c5b0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1c5c0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1c5d0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1c5e0 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
1c5f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
1c600 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
1c610 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1c620 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
1c630 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
1c640 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
1c650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c660 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1c670 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1c680 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1c690 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
1c6a0 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
1c6b0 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
1c6c0 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
1c6d0 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
1c6e0 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
1c6f0 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
1c700 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
1c710 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
1c720 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
1c730 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
1c740 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
1c750 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
1c760 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
1c770 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c780 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
1c790 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1c7a0 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
1c7b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c7c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
1c7d0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1c7e0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
1c7f0 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
1c800 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
1c810 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1c820 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1c830 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1c840 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1c850 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
1c860 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1c870 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
1c880 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
1c890 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1c8a0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1c8b0 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
1c8c0 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
1c8d0 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
1c8e0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
1c8f0 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
1c900 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
1c910 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
1c920 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
1c930 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
1c940 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
1c950 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
1c960 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1c970 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1c980 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
1c990 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c9a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1c9b0 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
1c9c0 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1c9d0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1c9e0 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
1c9f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1ca00 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1ca10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1ca20 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  get, 0);.  }else
1ca30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1ca40 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ca50 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1ca60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1ca70 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
1ca80 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65  aluates the give
1ca90 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
1caa0 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
1cab0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1cac0 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
1cad0 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
1cae0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1caf0 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
1cb00 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
1cb10 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
1cb20 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
1cb30 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
1cb40 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1cb50 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
1cb60 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
1cb70 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
1cb80 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
1cb90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1cba0 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
1cbb0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
1cbc0 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
1cbd0 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
1cbe0 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
1cbf0 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
1cc00 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1cc10 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
1cc20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cc30 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
1cc40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1cc50 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1cc60 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1cc70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1cc80 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
1cc90 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1cca0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1ccb0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1ccc0 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71  REGISTER );.  sq
1ccd0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1cce0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1ccf0 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b  get);.  iMem = +
1cd00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cd10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cd20 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74  p2(v, OP_Copy, t
1cd30 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20  arget, iMem);.  
1cd40 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
1cd50 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a  Expr, iMem);.}..
1cd60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1cd70 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
1cd80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
1cd90 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
1cda0 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1cdb0 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
1cdc0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1cdd0 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
1cde0 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
1cdf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1ce00 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1ce10 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a   evaluated..**.*
1ce20 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1ce30 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65  L_DUP flag preve
1ce40 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74  nts the argument
1ce50 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  s from being.** 
1ce60 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f  filled using OP_
1ce70 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20  SCopy.  OP_Copy 
1ce80 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
1ce90 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tead..**.** The 
1cea0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1ceb0 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f  OR argument allo
1cec0 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ws constant argu
1ced0 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66  ments to be.** f
1cee0 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f  actored out into
1cef0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1cf00 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1cf10 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
1cf20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
1cf30 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1cf40 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  he list with.** 
1cf50 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78  ExprList.a[].u.x
1cf60 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68  .iOrderByCol>0 h
1cf70 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1cf80 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73   evaluated and s
1cf90 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69  tored.** in regi
1cfa0 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c  sters at srcReg,
1cfb0 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75   and so the valu
1cfc0 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20  e can be copied 
1cfd0 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69  from there..*/.i
1cfe0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1cff0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1d000 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d010 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1d020 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1d030 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1d040 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1d050 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1d060 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1d070 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1d080 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1d090 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67   */.  int srcReg
1d0a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ,        /* Sour
1d0b0 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20  ce registers if 
1d0c0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
1d0d0 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
1d0e0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
1d0f0 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
1d100 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
1d110 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1d120 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  em;.  int i, j, 
1d130 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d  n;.  u8 copyOp =
1d140 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1d150 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f  _ECEL_DUP) ? OP_
1d160 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b  Copy : OP_SCopy;
1d170 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d180 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1d190 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1d1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
1d1b0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1d1c0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
1d1d0 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
1d1e0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
1d1f0 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
1d200 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1d210 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
1d220 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
1d230 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
1d240 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
1d250 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
1d260 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
1d270 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
1d280 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
1d290 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  em->pExpr;.    i
1d2a0 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
1d2b0 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20  TE_ECEL_REF)!=0 
1d2c0 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d 3e 61  && (j = pList->a
1d2d0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
1d2e0 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
1d2f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d300 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
1d310 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
1d320 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  i);.    }else if
1d330 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
1d340 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
1d350 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
1d360 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1d370 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1d380 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1d390 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d3a0 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20  target+i, 0);.  
1d3b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1d3c0 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
1d3d0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1d3e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d3f0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
1d400 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1d410 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
1d420 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
1d430 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
1d440 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1d450 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
1d460 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
1d470 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
1d480 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1d490 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
1d4a0 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
1d4b0 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
1d4c0 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
1d4d0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1d4e0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
1d4f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d510 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
1d520 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
1d530 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
1d540 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d550 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1d560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d570 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
1d580 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
1d590 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
1d5a0 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
1d5b0 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
1d5c0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
1d5d0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1d5e0 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
1d5f0 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
1d600 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
1d610 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
1d620 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
1d630 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74  tion of x..*/.st
1d640 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
1d650 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
1d660 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1d670 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1d680 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1d690 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1d6a0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
1d6b0 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
1d6c0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1d6d0 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
1d6e0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
1d6f0 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
1d700 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54  */.  int jumpIfT
1d710 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74  rue,   /* Take t
1d720 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
1d730 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a  ETWEEN is true *
1d740 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1d750 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
1d760 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1d770 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
1d780 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41  .){.  Expr exprA
1d790 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
1d7a0 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
1d7b0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
1d7c0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
1d7d0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
1d7e0 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
1d7f0 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
1d800 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
1d810 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
1d820 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
1d830 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
1d840 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
1d850 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
1d860 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
1d870 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
1d880 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1d890 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1d8a0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
1d8b0 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
1d8c0 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
1d8d0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
1d8e0 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
1d8f0 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
1d900 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
1d910 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
1d920 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
1d930 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
1d940 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
1d950 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
1d960 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1d970 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
1d980 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
1d990 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
1d9a0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1d9b0 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
1d9c0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d9d0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1d9e0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
1d9f0 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78  exprX, sqlite3Ex
1da00 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1da10 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
1da20 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75  ree1));.  if( ju
1da30 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1da40 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1da50 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1da60 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1da70 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1da80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1da90 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1daa0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1dab0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1dac0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1dad0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1dae0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1daf0 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1db00 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1db10 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1db20 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1db30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1db40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1db50 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1db60 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1db70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1db80 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1db90 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1dba0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1dbb0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1dbc0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1dbd0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1dbe0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1dbf0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1dc00 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1dc10 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1dc20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1dc30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1dc40 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1dc50 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1dc60 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1dc70 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1dc80 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1dc90 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1dca0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1dcb0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1dcc0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1dcd0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1dce0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1dcf0 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1dd00 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1dd10 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1dd20 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1dd30 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1dd40 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1dd50 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1dd60 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1dd70 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1dd80 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1dd90 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1dda0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1ddb0 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1ddc0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1ddd0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1dde0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1ddf0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1de00 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1de10 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1de20 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1de30 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1de40 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1de50 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1de60 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1de70 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1de80 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1de90 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1dea0 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1deb0 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1dec0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1ded0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1dee0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1def0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1df00 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1df10 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1df20 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1df30 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1df40 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1df50 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1df60 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1df70 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1df80 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1df90 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1dfa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dfb0 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1dfc0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1dfd0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1dfe0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1dff0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1e000 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1e010 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1e020 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1e030 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1e040 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1e050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1e060 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1e070 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1e080 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e090 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1e0a0 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1e0b0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1e0c0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1e0d0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1e0e0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1e0f0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1e100 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1e110 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1e120 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1e130 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1e140 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1e150 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1e160 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e170 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1e180 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e190 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e1a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1e1b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e1c0 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
1e1d0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1e1e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1e1f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1e200 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1e210 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1e220 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1e230 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1e240 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e260 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1e270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e280 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1e290 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1e2a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e2b0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1e2c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e2d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e2e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1e2f0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1e300 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1e310 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e320 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e330 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1e340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e350 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1e360 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e370 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e390 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1e3a0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1e3b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e3c0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1e3d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e3e0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e3f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e400 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1e410 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1e420 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e440 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1e450 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1e460 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1e470 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1e480 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1e490 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1e4a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e4b0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1e4c0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
1e4d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e4e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e4f0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1e500 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1e510 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1e520 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1e530 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1e540 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
1e550 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1e560 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e570 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1e580 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1e590 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1e5a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e5b0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e5c0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1e5d0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1e5e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e5f0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1e600 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1e610 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1e620 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1e630 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e640 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1e650 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1e660 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1e670 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1e680 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1e690 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1e6a0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1e6b0 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1e6c0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1e6d0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1e6e0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
1e6f0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1e700 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1e710 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1e720 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e730 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
1e740 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1e750 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1e760 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1e770 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1e780 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1e790 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1e7a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e7b0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1e7c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e7d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1e7e0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1e7f0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
1e800 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1e810 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1e820 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1e830 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1e840 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1e850 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1e860 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1e870 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1e880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e890 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1e8a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1e8b0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1e8c0 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1e8d0 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1e8e0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1e8f0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1e900 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1e910 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e930 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1e940 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1e950 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1e960 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b  f(v, op==TK_EQ);
1e970 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1e980 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1e990 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  NE);.      testc
1e9a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1e9b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e9c0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1e9d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e9e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e9f0 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1ea00 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1ea10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ea20 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1ea30 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
1ea40 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1ea50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ea60 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
1ea70 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
1ea80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1ea90 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1eaa0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1eab0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1eac0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1ead0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1eae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1eaf0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1eb00 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1eb10 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1eb20 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1eb30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1eb40 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1eb50 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
1eb60 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1eb70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1eb80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1eb90 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1eba0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ebb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ebc0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1ebd0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1ebe0 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70  r, dest, 1, jump
1ebf0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1ec00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1ec10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ec20 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1ec30 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1ec40 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
1ec50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ec60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ec70 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
1ec80 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
1ec90 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
1eca0 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
1ecb0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1ecc0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
1ecd0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
1ece0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1ecf0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1ed00 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1ed10 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ed20 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
1ed30 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1ed40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1ed50 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1ed60 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
1ed70 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
1ed80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ed90 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
1eda0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1edb0 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
1edc0 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
1edd0 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a      /* No-op */.
1ede0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1edf0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ee00 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ee10 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
1ee20 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
1ee30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ee40 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
1ee50 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1ee60 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
1ee70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ee80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ee90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1eea0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1eeb0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1eec0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1eed0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1eee0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1eef0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ef00 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1ef10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1ef20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1ef30 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
1ef40 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1ef50 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1ef60 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1ef70 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1ef80 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1ef90 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1efa0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1efb0 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
1efc0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1efd0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1efe0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1eff0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
1f000 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1f010 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1f020 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1f030 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
1f040 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
1f050 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
1f060 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
1f070 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
1f080 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
1f090 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
1f0a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
1f0b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1f0c0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1f0d0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1f0e0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1f0f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1f100 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1f110 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1f120 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1f130 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1f140 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1f150 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1f160 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1f170 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f180 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1f190 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  =0) ) return; /*
1f1a0 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44   Existence of VD
1f1b0 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61  BE checked by ca
1f1c0 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45  ller */.  if( pE
1f1d0 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75  xpr==0 )    retu
1f1e0 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
1f1f0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
1f200 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
1f210 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
1f220 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1f230 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
1f240 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
1f250 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
1f260 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1f270 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
1f280 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
1f290 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
1f2a0 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
1f2b0 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
1f2c0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1f2d0 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
1f2e0 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
1f2f0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
1f300 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
1f310 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
1f320 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
1f330 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
1f340 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1f350 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1f360 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
1f370 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
1f380 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
1f390 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
1f3a0 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
1f3b0 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
1f3c0 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
1f3d0 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
1f3e0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
1f3f0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1f400 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
1f410 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
1f420 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
1f430 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
1f440 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
1f450 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
1f460 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
1f470 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
1f480 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
1f490 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
1f4a0 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
1f4b0 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
1f4c0 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
1f4d0 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
1f4e0 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
1f4f0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
1f500 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
1f510 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f520 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
1f530 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
1f540 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1f550 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
1f560 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
1f570 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
1f580 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f590 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
1f5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f5b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
1f5c0 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
1f5d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f5e0 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
1f5f0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
1f600 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f610 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
1f620 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f630 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
1f640 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
1f650 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f660 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
1f670 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
1f680 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
1f690 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1f6a0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
1f6b0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f6c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1f6d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1f6e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f6f0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1f700 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1f710 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f720 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1f730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1f740 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1f750 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1f760 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f770 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f780 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1f790 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f7a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f7b0 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
1f7c0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1f7d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1f7e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f810 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1f820 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1f830 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
1f840 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1f850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f860 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f870 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1f880 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1f890 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1f8a0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1f8b0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1f8c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f8d0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
1f8e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f8f0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1f900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f910 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f920 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
1f930 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1f940 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1f950 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1f960 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f970 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1f980 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f990 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f9a0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1f9b0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1f9c0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1f9d0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1f9e0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1f9f0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1fa00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1fa10 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1fa20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fa30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fa40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fa50 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fa60 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1fa70 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fa80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fa90 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1faa0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1fab0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1fac0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1fad0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1fb00 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1fb10 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1fb20 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1fb30 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1fb40 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1fb50 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
1fb60 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1fb70 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1fb80 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1fb90 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fba0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
1fbb0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1fbc0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1fbd0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1fbe0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1fbf0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
1fc00 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1fc10 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1fc20 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1fc30 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1fc40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fc50 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1fc60 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1fc70 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1fc80 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1fc90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fca0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1fcb0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1fcc0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1fcd0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1fce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1fcf0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1fd00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fd10 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1fd20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fd30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1fd40 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1fd50 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1fd60 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1fd70 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1fd80 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1fd90 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1fda0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fdb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fdc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fdd0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fde0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1fdf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fe00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fe10 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1fe20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
1fe30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
1fe40 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
1fe50 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1fe60 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1fe70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1fe80 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1fea0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1feb0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1fec0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1fed0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b  f(v, op==TK_EQ);
1fee0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1fef0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1ff00 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  NE);.      testc
1ff10 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1ff20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1ff30 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1ff40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ff50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ff60 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1ff70 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1ff80 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1ff90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ffa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ffb0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1ffc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ffd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1ffe0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1fff0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20000 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56  TK_ISNULL );   V
20010 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20020 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
20030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20040 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
20050 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
20060 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
20070 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
20080 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
20090 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
200a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
200b0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
200c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
200d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
200e0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
200f0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
20100 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a  Expr, dest, 0, j
20110 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
20120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
20130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20140 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
20150 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
20160 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75      if( jumpIfNu
20170 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
20180 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
20190 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
201a0 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  est, dest);.    
201b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
201c0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
201d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
201e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
201f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20200 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
20210 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66  pr, dest, destIf
20220 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
20230 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
20240 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
20250 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
20260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20270 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
20280 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
20290 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  ( exprAlwaysFals
202a0 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
202b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
202c0 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
202d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
202e0 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
202f0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
20300 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
20310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20320 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20330 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20340 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
20350 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
20360 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
20370 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
20380 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
20390 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
203a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
203b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
203c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
203d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
203e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
203f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
20410 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20420 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20430 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
20440 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20450 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
20460 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
20470 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  Like sqlite3Expr
20480 49 66 46 61 6c 73 65 28 29 20 65 78 63 65 70 74  IfFalse() except
20490 20 74 68 61 74 20 61 20 63 6f 70 79 20 69 73 20   that a copy is 
204a0 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20 62 65  made of pExpr be
204b0 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e  fore.** code gen
204c0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61  eration, and tha
204d0 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65 74 65  t copy is delete
204e0 64 20 61 66 74 65 72 20 63 6f 64 65 20 67 65 6e  d after code gen
204f0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a  eration. This.**
20500 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
20510 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78 70 72  e original pExpr
20520 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
20530 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
20540 70 72 49 66 46 61 6c 73 65 44 75 70 28 50 61 72  prIfFalseDup(Par
20550 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
20560 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
20570 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  t,int jumpIfNull
20580 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20590 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
205a0 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 73   Expr *pCopy = s
205b0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
205c0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
205d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
205e0 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  led==0 ){.    sq
205f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
20600 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79 2c 20  (pParse, pCopy, 
20610 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
20620 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
20630 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
20640 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Copy);.}.../*.**
20650 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
20660 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
20670 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
20680 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
20690 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
206a0 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ns are completel
206b0 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65  y identical.  Re
206c0 74 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64  turn 1 if they d
206d0 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79  iffer only.** by
206e0 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
206f0 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c  tor at the top l
20700 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20  evel.  Return 2 
20710 69 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  if there are dif
20720 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65  ferences.** othe
20730 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c  r than the top-l
20740 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65  evel COLLATE ope
20750 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rator..**.** If 
20760 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
20770 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
20780 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
20790 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
207a0 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
207b0 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
207c0 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
207d0 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
207e0 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
207f0 68 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74  he pA side might
20800 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47   be using TK_REG
20810 49 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20  ISTER.  If that 
20820 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
20830 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69  pB is.** not usi
20840 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62  ng TK_REGISTER b
20850 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
20860 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e  equivalent, then
20870 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e   still return 0.
20880 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
20890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
208a0 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e  ll return 2 even
208b0 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
208c0 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
208d0 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
208e0 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
208f0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
20900 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
20910 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
20920 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f  return 2 just to
20930 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
20940 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
20950 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e   returns 2, then
20960 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c   you do not real
20970 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74  ly know for cert
20980 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  ain if the two.*
20990 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
209a0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
209b0 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20   if you get a 0 
209c0 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65  or 1 return, the
209d0 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
209e0 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
209f0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
20a00 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
20a10 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
20a20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
20a30 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
20a40 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
20a50 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75  a 2 - that.** ju
20a60 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  st might result 
20a70 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79  in some slightly
20a80 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42   slower code.  B
20a90 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  ut returning.** 
20aa0 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f  an incorrect 0 o
20ab0 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  r 1 could lead t
20ac0 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e  o a malfunction.
20ad0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
20ae0 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
20af0 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
20b00 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
20b10 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
20b20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
20b30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
20b40 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
20b50 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
20b60 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
20b70 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
20b80 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
20b90 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
20ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
20bb0 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
20bc0 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
20bd0 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
20be0 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
20bf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
20c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
20c10 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
20c20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
20c30 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
20c40 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
20c50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20c60 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
20c70 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
20c80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20c90 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f   }.    if( pB->o
20ca0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
20cb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
20cc0 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66  are(pA, pB->pLef
20cd0 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  t, iTab)<2 ){.  
20ce0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20cf0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
20d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
20d10 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
20d20 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
20d30 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
20d40 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
20d50 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
20d60 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69  CTION ){.      i
20d70 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
20d80 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70  p(pA->u.zToken,p
20d90 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20  B->u.zToken)!=0 
20da0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20db0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
20dc0 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42  (pA->u.zToken,pB
20dd0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29  ->u.zToken)!=0 )
20de0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
20df0 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
20e00 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d  E ? 1 : 2;.    }
20e10 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e  .  }.  if( (pA->
20e20 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
20e30 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
20e40 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
20e50 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66  ) return 2;.  if
20e60 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
20e70 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b  edFlags & EP_Tok
20e80 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20  enOnly)==0) ){. 
20e90 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46     if( combinedF
20ea0 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c  lags & EP_xIsSel
20eb0 65 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ect ) return 2;.
20ec0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
20ed0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
20ee0 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  Left, pB->pLeft,
20ef0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
20f00 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
20f10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
20f20 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
20f30 69 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65  ight, iTab) ) re
20f40 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
20f50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
20f60 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69  ompare(pA->x.pLi
20f70 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c  st, pB->x.pList,
20f80 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
20f90 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  2;.    if( ALWAY
20fa0 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
20fb0 20 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d   & EP_Reduced)==
20fc0 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  0) && pA->op!=TK
20fd0 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20  _STRING ){.     
20fe0 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
20ff0 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
21000 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
21010 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
21020 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20  pB->iTable .    
21030 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c     && (pA->iTabl
21040 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52  e!=iTab || NEVER
21050 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29  (pB->iTable>=0))
21060 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
21070 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21080 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
21090 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  are two ExprList
210a0 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72   objects.  Retur
210b0 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  n 0 if they are 
210c0 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a  identical and .*
210d0 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
210e0 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
210f0 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   way..**.** If a
21100 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
21110 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
21120 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
21130 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
21140 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
21150 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
21160 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
21170 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
21180 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
21190 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
211a0 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
211b0 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20   for equivalent 
211c0 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a  ExprLists.  The.
211d0 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65  ** only conseque
211e0 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61  nce will be disa
211f0 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  bled optimizatio
21200 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  ns.  But this ro
21210 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65  utine.** must ne
21220 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20  ver return 0 if 
21230 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74  the two ExprList
21240 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66   objects are dif
21250 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20  ferent, or.** a 
21260 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  malfunction will
21270 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54   result..**.** T
21280 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73  wo NULL pointers
21290 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
212a0 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20  to be the same. 
212b0 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e   But a NULL poin
212c0 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69  ter.** always di
212d0 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e  ffers from a non
212e0 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a  -NULL pointer..*
212f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
21300 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70  rListCompare(Exp
21310 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c  rList *pA, ExprL
21320 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  ist *pB, int iTa
21330 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
21340 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d  f( pA==0 && pB==
21350 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21360 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
21370 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
21380 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d   if( pA->nExpr!=
21390 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  pB->nExpr ) retu
213a0 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 1;.  for(i=0;
213b0 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b   i<pA->nExpr; i+
213c0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
213d0 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e  xprA = pA->a[i].
213e0 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
213f0 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b  *pExprB = pB->a[
21400 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
21410 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  ( pA->a[i].sortO
21420 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73  rder!=pB->a[i].s
21430 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72  ortOrder ) retur
21440 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 1;.    if( sql
21450 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
21460 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20  pExprA, pExprB, 
21470 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31  iTab) ) return 1
21480 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
21490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
214a0 6e 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e  n true if we can
214b0 20 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77   prove the pE2 w
214c0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72  ill always be tr
214d0 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20  ue if pE1 is.** 
214e0 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61  true.  Return fa
214f0 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  lse if we cannot
21500 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72   complete the pr
21510 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69  oof or if pE2 mi
21520 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e  ght.** be false.
21530 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
21540 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20  *     pE1: x==5 
21550 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
21560 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
21570 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
21580 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20  pE1: x>0        
21590 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
215a0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61        Result: fa
215b0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
215c0 78 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20  x=21       pE2: 
215d0 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20  x=21 OR y=43    
215e0 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
215f0 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33       pE1: x!=123
21600 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
21610 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
21620 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
21630 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70  E1: x!=?1      p
21640 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
21650 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
21660 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
21670 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20  IS NULL  pE2: x 
21680 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
21690 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
216a0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32      pE1: x IS ?2
216b0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
216c0 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74  T NULL    Reuslt
216d0 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68  : false.**.** Wh
216e0 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f  en comparing TK_
216f0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74  COLUMN nodes bet
21700 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32  ween pE1 and pE2
21710 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20  , if pE2 has.** 
21720 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68  Expr.iTable<0 th
21730 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c  en assume a tabl
21740 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62  e number given b
21750 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68  y iTab..**.** Wh
21760 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
21770 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75  urn false.  Retu
21780 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74  rning true might
21790 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
217a0 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65  nce.** improveme
217b0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66  nt.  Returning f
217c0 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65  alse might cause
217d0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72   a performance r
217e0 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  eduction, but.**
217f0 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   it will always 
21800 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  give the correct
21810 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68   answer and is h
21820 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65  ence always safe
21830 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21840 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21850 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20  Expr *pE1, Expr 
21860 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b  *pE2, int iTab){
21870 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
21880 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70  prCompare(pE1, p
21890 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a  E2, iTab)==0 ){.
218a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
218b0 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
218c0 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71  =TK_OR.   && (sq
218d0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
218e0 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
218f0 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20  Left, iTab).    
21900 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
21910 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
21920 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69  pr(pE1, pE2->pRi
21930 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29  ght, iTab) ).  )
21940 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21950 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
21960 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
21970 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
21980 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66  ompare(pE1->pLef
21990 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  t, pE2->pLeft, i
219a0 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  Tab)==0.   && (p
219b0 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  E1->op!=TK_ISNUL
219c0 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b  L && pE1->op!=TK
219d0 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  _IS).  ){.    re
219e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
219f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
21a00 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
21a10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
21a20 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
21a30 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  by the tree walk
21a40 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72  er.** to count r
21a50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
21a60 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  le columns in th
21a70 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61  e arguments of a
21a80 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  n .** aggregate 
21a90 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64  function, in ord
21aa0 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  er to implement 
21ab0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75  the.** sqlite3Fu
21ac0 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20  nctionThisSrc() 
21ad0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
21ae0 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20  ct SrcCount {.  
21af0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
21b00 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c   /* One particul
21b10 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  ar FROM clause i
21b20 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79  n a nested query
21b30 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b   */.  int nThis;
21b40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21b50 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
21b60 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72  o columns in pSr
21b70 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  cList */.  int n
21b80 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e  Other;      /* N
21b90 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
21ba0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
21bb0 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  n other FROM cla
21bc0 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  uses */.};../*.*
21bd0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
21be0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
21bf0 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a   to columns..*/.
21c00 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
21c10 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a  rcCount(Walker *
21c20 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
21c30 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Expr){.  /* The 
21c40 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73  NEVER() on the s
21c50 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65  econd term is be
21c60 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e  cause sqlite3Fun
21c70 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
21c80 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79  ().  ** is alway
21c90 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
21ca0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
21cb0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61  zeAggregates() a
21cc0 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54  nd so the.  ** T
21cd0 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e  K_COLUMNs have n
21ce0 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76  ot yet been conv
21cf0 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47  erted into TK_AG
21d00 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20  G_COLUMN.  If.  
21d10 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
21d20 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20  onUsesThisSrc() 
21d30 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e  is used differen
21d40 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72  tly in the futur
21d50 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45  e, the.  ** NEVE
21d60 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  R() will need to
21d70 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a   be removed. */.
21d80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
21d90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45  =TK_COLUMN || NE
21da0 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  VER(pExpr->op==T
21db0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b  K_AGG_COLUMN) ){
21dc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
21dd0 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
21de0 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
21df0 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53  pSrcCount;.    S
21e00 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
21e10 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->pSrc;.    int 
21e20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53  nSrc = pSrc ? pS
21e30 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20  rc->nSrc : 0;.  
21e40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72    for(i=0; i<nSr
21e50 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
21e60 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21e70 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  ==pSrc->a[i].iCu
21e80 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
21e90 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53    }.    if( i<nS
21ea0 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
21eb0 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
21ec0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
21ed0 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
21ee0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
21ef0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
21f00 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
21f10 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
21f20 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
21f30 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
21f40 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
21f50 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
21f60 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
21f70 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
21f80 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
21f90 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
21fa0 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
21fb0 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
21fc0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
21fd0 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
21fe0 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
21ff0 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
22000 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
22010 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
22020 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
22030 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
22040 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
22050 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
22060 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
22070 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
22080 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
22090 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
220a0 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
220b0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
220c0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
220d0 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
220e0 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f  nt;.  w.u.pSrcCo
220f0 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
22100 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
22110 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
22120 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
22130 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
22140 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
22150 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
22160 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
22170 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
22180 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
22190 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
221a0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
221b0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
221c0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
221d0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
221e0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
221f0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
22200 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
22210 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
22220 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
22230 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
22240 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
22250 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
22260 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
22270 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
22280 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
22290 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
222a0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
222b0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
222c0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
222d0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
222e0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
222f0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
22300 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
22310 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
22320 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
22330 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
22340 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
22350 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
22360 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
22370 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
22380 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
22390 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
223a0 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
223b0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
223c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
223d0 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
223e0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
223f0 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
22400 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
22410 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
22420 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
22430 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
22440 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
22450 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
22460 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
22470 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
22480 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
22490 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
224a0 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
224b0 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
224c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
224d0 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
224e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
224f0 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
22500 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
22510 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
22520 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
22530 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
22540 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
22550 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
22560 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
22570 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
22580 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
22590 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
225a0 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
225b0 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
225c0 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
225d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
225e0 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
225f0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
22600 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
22610 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
22620 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
22630 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
22640 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
22650 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
22660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22670 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
22680 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
22690 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
226a0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
226b0 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
226c0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
226d0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
226e0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
226f0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
22700 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
22710 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
22720 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
22730 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
22740 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
22750 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22760 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
22770 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
22780 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
22790 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
227a0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
227b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
227c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
227d0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
227e0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
227f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
22800 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
22810 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
22820 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
22830 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
22840 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
22850 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
22860 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
22870 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
22880 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22890 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
228a0 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
228b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
228c0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
228d0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
228e0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
228f0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
22900 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22910 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
22920 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
22930 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
22940 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
22950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
22960 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
22970 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
22980 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
22990 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
229a0 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
229b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
229c0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
229d0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
22a00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
22a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22a20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22a50 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
22a60 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
22a70 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
22a80 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
22a90 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
22aa0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
22ab0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
22ac0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
22ad0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
22ae0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
22af0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
22b00 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
22b10 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22b20 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
22b30 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
22b40 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
22b50 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
22b60 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
22b70 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
22b80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22b90 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
22ba0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
22bb0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
22bc0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
22bd0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
22be0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22bf0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
22c00 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
22c10 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
22c40 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
22c50 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
22c60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
22c70 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
22c80 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
22c90 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
22ca0 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
22cb0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
22cc0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
22cd0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
22ce0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
22cf0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
22d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22d10 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
22d20 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
22d30 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
22d40 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
22d70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
22da0 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22dd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22de0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22df0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22e00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22e10 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
22e20 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
22e30 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
22e40 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
22e50 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
22e60 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
22e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22e90 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
22ea0 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
22eb0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
22ec0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
22ed0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
22ee0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
22ef0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
22f00 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
22f10 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
22f20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
22f30 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
22f40 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
22f50 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
22f60 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
22f70 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
22f80 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
22f90 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
22fa0 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
22fb0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
22fc0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
22fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
22fe0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
22ff0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
23000 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
23010 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
23020 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
23030 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
23040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
23050 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
23060 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
23070 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
23080 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
23090 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
230a0 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
230b0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
230c0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
230d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
230e0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
230f0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
23100 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
23110 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
23120 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
23130 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
23140 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
23150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
23160 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
23170 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
23180 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
23190 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
231a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
231b0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
231c0 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
231d0 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
231e0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
231f0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
23200 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
23210 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
23220 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
23230 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
23240 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
23250 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23260 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
23270 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
23280 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
23290 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
232a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
232b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
232c0 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
232d0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
232e0 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
232f0 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
23300 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
23310 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
23320 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23330 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
23340 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
23350 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
23360 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
23370 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
23380 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23390 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
233a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
233b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
233c0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
233d0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
233e0 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
233f0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
23400 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
23410 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
23420 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
23430 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
23440 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
23450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23460 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23470 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
23480 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
23490 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
234a0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
234b0 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
234c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
234d0 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
234e0 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ken, sqlite3Strl
234f0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
23500 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
23510 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
23520 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
23530 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
23540 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
23550 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23560 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
23570 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
23580 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
23590 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
235a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
235b0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
235d0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
235e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
235f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
23600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23610 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
23620 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
23630 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
23640 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
23650 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23660 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23670 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
23680 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
23690 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
236a0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
236b0 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
236c0 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
236d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
236e0 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
236f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
23700 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
23710 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23720 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
23730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23740 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23750 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
23760 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23770 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
23780 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
23790 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
237a0 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
237b0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
237c0 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
237d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c  D_PARAMETER(pWal
237e0 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ker);.  UNUSED_P
237f0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
23800 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
23810 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
23820 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
23830 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
23840 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
23850 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
23860 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
23870 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
23880 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
23890 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
238a0 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
238b0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
238c0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
238d0 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
238e0 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
238f0 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
23900 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23910 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
23920 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
23930 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23940 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
23950 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
23960 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
23970 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
23980 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
23990 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
239a0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
239b0 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
239c0 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
239d0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
239e0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
239f0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
23a00 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
23a10 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
23a20 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
23a30 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
23a40 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
23a50 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
23a60 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
23a70 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
23a80 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
23a90 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
23aa0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
23ab0 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
23ac0 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
23ad0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
23ae0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
23af0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
23b00 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
23b10 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
23b20 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
23b30 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
23b40 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23b50 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
23b60 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
23b70 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
23b80 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23b90 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
23ba0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
23bb0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
23bc0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
23bd0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
23be0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
23bf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
23c00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23c10 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
23c20 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
23c30 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
23c40 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
23c50 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
23c60 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
23c70 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
23c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
23c90 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
23ca0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
23cb0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
23cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
23cd0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
23ce0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
23cf0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
23d00 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
23d10 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
23d20 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
23d30 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
23d40 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
23d50 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
23d60 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
23d70 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
23d80 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
23d90 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
23da0 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
23db0 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61  .** the dealloca
23dc0 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64  tion is deferred
23dd0 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d   until the colum
23de0 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61  n cache line tha
23df0 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65  t uses.** the re
23e00 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73  gister becomes s
23e10 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tale..*/.void sq
23e20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
23e30 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
23e40 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
23e50 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
23e60 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
23e70 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
23e80 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
23e90 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
23ea0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
23eb0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
23ec0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
23ed0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
23ee0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
23ef0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
23f00 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
23f10 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
23f20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
23f30 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
23f40 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
23f50 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
23f60 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52  nTempReg++] = iR
23f70 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
23f80 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
23f90 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20  llocate a block 
23fa0 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74  of nReg consecut
23fb0 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f  ive registers.*/
23fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
23fd0 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
23fe0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
23ff0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
24000 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
24010 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
24020 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
24030 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
24040 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
24050 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
24060 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
24070 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
24080 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
24090 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
240a0 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
240b0 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
240c0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
240d0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
240e0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
240f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
24100 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
24110 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
24120 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
24130 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
24140 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
24150 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
24160 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a  e, iReg, nReg);.
24170 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
24180 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
24190 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
241a0 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
241b0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
241c0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
241d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
241e0 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
241f0 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
24200 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
24210 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
24220 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
24230 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
24240 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
24250 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
24260 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
24270 65 67 20 3d 20 30 3b 0a 7d 0a                    eg = 0;.}.