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

Artifact fbf0706199aea23c54efe36b6932d8307c4eb872:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0b60: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0b70: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0b80: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b90: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0ba0: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0bc0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0bd0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ATE operators an
0be0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0bf0: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c10: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c20: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c40: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c50: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c60: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c80: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ca0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cb0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cc0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0ce0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0cf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d00: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d40: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d80: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d90: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
0da0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0db0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0dc0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0dd0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0de0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0df0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e00: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0e10: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e30: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e40: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e70: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e80: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e90: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0ea0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0eb0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ec0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ef0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0f00: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0f10: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f20: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f30: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f40: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f50: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0fa0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0fb0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fc0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fe0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0ff0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
1000: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1010: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1020: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1030: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1040: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1060: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1070: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1080: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1090: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
10b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10d0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1100: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
1110: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1120: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1130: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1140: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1150: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1160: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1170: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1180: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1190: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
11a0: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
11b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11c0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11d0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11e0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11f0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
1200: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1210: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1220: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1230: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1240: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1250: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1260: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1270: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1280: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1290: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
12a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
12f0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1300: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1310: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1320: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1340: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1350: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
1370: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
1380: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
1390: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
13a0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
13b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
13c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
13d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13e0: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
13f0: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1400: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1410: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1420: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1430: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
1440: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
1450: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
1460: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
1470: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
1480: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
1490: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
14a0: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
14b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14c0: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
14d0: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
14e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
14f0: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1520: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1530: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
1540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1550: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1560: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
1570: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
1580: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
1590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
15a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
15b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1630: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
1640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1650: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
1660: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
1670: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1680: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1690: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
16a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
16b0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
16c0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
16d0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
16e0: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
16f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1700: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
1710: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
1720: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
1730: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1740: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
1750: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1760: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
1770: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
1780: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
1790: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
17a0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
17b0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
17c0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
17d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
17f0: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1800: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1810: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1820: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1830: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1840: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1850: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1860: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1870: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1880: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
1890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18a0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
18b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
18d0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  B;.    }.  }else
18e0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
18f0: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1900: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1920: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1930: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1940: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1950: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1960: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
1970: 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
1980: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
1990: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
19a0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
19b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
19c0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
19d0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
19e0: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
19f0: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1a00: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1a10: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1a30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1a40: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1a50: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1a60: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1a70: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
1a80: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
1a90: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
1aa0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
1ab0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1ac0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
1ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ae0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1af0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1b00: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b10: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1b20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1b30: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1b40: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1b50: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b70: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
1b80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
1b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1ba0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
1bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
1bc0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
1bd0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1bf0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1c00: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1c10: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1c20: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1c30: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1c40: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c60: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c70: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
1c80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1c90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
1ca0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1cb0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
1cc0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1cd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1ce0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
1cf0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1d00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1d10: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1d20: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1d30: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1d40: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1d50: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1d60: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1d70: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1d80: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
1d90: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
1da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
1db0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dc0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1dd0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1e00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1e10: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1e20: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1e30: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1e40: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1e50: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1e60: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
1e70: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
1e80: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
1e90: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
1ea0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
1eb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1ec0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1ed0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1ee0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1ef0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1f00: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f20: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1f30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1f40: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1f50: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1f60: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1f70: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1f80: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
1f90: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
1fa0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
1fb0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
1fc0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1fd0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1fe0: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1ff0: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
2000: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
2010: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
2020: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2030: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
2040: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
2050: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2070: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2080: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2090: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
20a0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
20b0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
20c0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
20d0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
20e0: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
20f0: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
2110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2120: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
2130: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
2140: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
2150: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
2160: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
2170: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
2180: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
2190: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
21a0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
21b0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
21c0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
21d0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
21e0: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
21f0: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
2200: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
2210: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
2220: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2230: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
2240: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
2250: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
2260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2270: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
2280: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
2290: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
22b0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
22c0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
22d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
22e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
22f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2300: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
2310: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
2320: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2330: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
2340: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2350: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2360: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2380: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2390: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23a0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
23b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
23c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23e0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
2410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2420: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
2430: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
2440: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
2450: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2460: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
2470: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
2480: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
2490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
24b0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
24c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
24d0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
24e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
24f0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
2500: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
2510: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
2520: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
2530: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
2540: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
2550: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
2560: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2570: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
2580: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
2590: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
25a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
25b0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
25c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
25d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
25e0: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
25f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2620: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2630: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2650: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2670: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2680: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2690: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
26c0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
26d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e0: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
26f0: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2700: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
2710: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
2720: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
2730: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
2740: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
2750: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2760: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2770: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
2780: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
2790: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
27a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
27b0: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
27c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27d0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
27e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
27f0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
2800: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2810: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
2820: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
2830: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2840: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
2850: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
2860: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
2870: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2880: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
2890: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
28a0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
28b0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
28c0: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
28d0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
28e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
28f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2900: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
2910: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
2930: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2940: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
2950: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
2960: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2970: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2980: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
2990: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
29a0: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
29b0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
29c0: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
29d0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
29e0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
29f0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2a00: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
2a10: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
2a20: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
2a30: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
2a40: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
2a50: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
2a60: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
2a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
2a80: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
2a90: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2aa0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2ab0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
2ac0: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
2ad0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
2ae0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
2af0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2b00: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2b10: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
2b20: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2b30: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2b40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2b50: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2b60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
2b70: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
2b80: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
2b90: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2ba0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2bb0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
2bc0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
2bd0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2be0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
2bf0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
2c00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2c10: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
2c20: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
2c30: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2c40: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
2c50: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c60: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
2c70: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
2c80: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c90: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
2ca0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2cb0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2cc0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
2cd0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2ce0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2cf0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
2d00: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2d10: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
2d20: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
2d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
2d40: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
2d50: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
2d60: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2d70: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
2d80: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
2d90: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
2da0: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
2db0: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
2dc0: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
2dd0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
2de0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
2df0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
2e00: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
2e10: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2e20: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
2e30: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
2e40: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
2e50: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
2e60: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
2e70: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
2e80: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
2e90: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
2ea0: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
2ec0: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
2ed0: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
2ee0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
2ef0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
2f00: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
2f20: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
2f30: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2f40: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2f50: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
2f60: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
2f70: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2f80: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2f90: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
2fa0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2fb0: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
2fc0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
2fd0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
2fe0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
2ff0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3000: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
3010: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
3020: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
3030: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
3040: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
3050: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
3060: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
3070: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
3080: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
3090: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
30a0: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
30b0: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
30c0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
30d0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
30e0: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
30f0: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
3100: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
3110: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
3120: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
3130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3140: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
3150: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
3160: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
3170: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
3180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
3190: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
31a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
31b0: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
31c0: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
31d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
31e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
31f0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
3200: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
3210: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
3220: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
3230: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
3240: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
3250: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
3260: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
3270: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
3280: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
3290: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
32a0: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
32b0: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
32c0: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
32d0: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
32e0: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
3300: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
3310: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
3320: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
3330: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
3340: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
3350: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
3360: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
3370: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
3380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
3390: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
33a0: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
33b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
33c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
33d0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
33e0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
33f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3400: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
3410: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
3420: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
3430: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
3440: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
3450: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
3460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
3470: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
3480: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
3490: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
34a0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
34b0: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
34c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
34d0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
34e0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
34f0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
3500: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
3510: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
3520: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
3530: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
3540: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
3550: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
3560: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
3570: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
3580: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
3590: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
35a0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
35b0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
35c0: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
35d0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
35e0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
35f0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
3600: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
3610: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
3620: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3630: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3640: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3650: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3660: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3670: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3680: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3690: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
36a0: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
36b0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
36c0: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
36d0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
36e0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
36f0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
3700: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
3710: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
3720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3730: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3740: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3750: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3760: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3770: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3780: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3790: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
37a0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
37b0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
37c0: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
37d0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
37e0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
37f0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
3800: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
3810: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
3820: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3830: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3840: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3850: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3860: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3880: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3890: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
38a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
38b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
38c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
38d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
38e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
38f0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
3900: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
3910: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
3920: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3940: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3950: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3960: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3970: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3980: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
3990: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
39a0: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
39b0: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
39c0: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
39d0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
39e0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
39f0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
3a00: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
3a10: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
3a20: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
3a30: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
3a50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3a60: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
3a70: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3a80: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3a90: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
3aa0: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
3ab0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
3ac0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3ad0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3ae0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3af0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3b00: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3b10: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3b20: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3b30: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3b40: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b60: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3b70: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3b80: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3b90: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3ba0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3bb0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3bc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3bd0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3be0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3bf0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3c00: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3c10: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3c20: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3c30: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3c40: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3c50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3c60: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3c70: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3c80: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3c90: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3cb0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3cc0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3cd0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3cf0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3d10: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3d20: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3d30: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3d40: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d60: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3d70: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3d80: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3d90: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3da0: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3db0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dc0: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3dd0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3de0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3e00: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3e10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3e20: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3e30: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e50: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3e70: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3e80: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3e90: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3ea0: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3eb0: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3ec0: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3ed0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3ee0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3ef0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3f00: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3f10: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3f20: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3f30: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3f40: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3f50: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3f60: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3f70: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3f80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3f90: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3fa0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3fb0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3fc0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3fd0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3ff0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
4000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4010: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
4020: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
4030: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
4040: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
4050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4080: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
40a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
40b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
40c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
40d0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
40e0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
40f0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
4100: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
4110: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
4120: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
4130: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
4140: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
4150: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
4160: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
4170: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
4180: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
4190: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
41a0: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
41b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
41c0: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
41d0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
41e0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
41f0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
4200: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
4210: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
4220: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4230: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
4240: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
4250: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
4260: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
4270: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4280: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
4290: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
42a0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
42b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
42c0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
42d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
42e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4310: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
4320: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
4330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
4340: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
4350: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
4360: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
4370: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
4380: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
4390: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
43a0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
43b0: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
43c0: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
43d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
4400: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
4410: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
4420: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4430: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4450: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4460: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4470: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4480: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54  arse->db, op & T
4490: 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65  KFLG_MASK, pToke
44a0: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
44b0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
44c0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
44d0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
44e0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
44f0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
4500: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
4510: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
4520: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4530: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   p;.}../*.** If 
4540: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4550: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
4560: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
4570: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
4580: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
4590: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
45a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
45b0: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
45c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
45d0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
45e0: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
45f0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
4600: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
4610: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
4620: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
4630: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
4640: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
4650: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
4660: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
4670: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
4680: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
4690: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
46a0: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
46b0: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
46c0: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
46d0: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
46e0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
46f0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
4700: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
4710: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
4720: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
4730: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
4740: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
4750: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
4760: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
4770: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
4780: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
4790: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
47a0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
47b0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
47c0: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
47d0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
47e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
47f0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
4800: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
4810: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
4820: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
4830: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4840: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
4850: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
4860: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
4870: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
4880: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4890: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
48a0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
48b0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
48c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
48d0: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
48e0: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
48f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
4900: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
4910: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
4920: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
4930: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
4940: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
4950: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
4960: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
4970: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
4980: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4990: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
49a0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
49b0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
49c0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
49d0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
49e0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
49f0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
4a00: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
4a10: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
4a20: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
4a30: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
4a40: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
4a50: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
4a60: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
4a70: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
4a80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
4a90: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
4aa0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
4ab0: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
4ac0: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
4ad0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
4ae0: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
4af0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4b00: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
4b10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4b20: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
4b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
4b40: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4b50: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
4b60: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
4b70: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
4b80: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
4b90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4ba0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
4bb0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4bc0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
4bd0: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
4be0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
4bf0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
4c00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
4c10: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
4c20: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
4c30: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
4c40: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
4c50: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
4c60: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
4c70: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
4c80: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4c90: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
4ca0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
4cb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4cc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4cd0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4ce0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4cf0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4d00: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4d10: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4d20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4d30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4d40: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4d50: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
4d60: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
4d70: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
4d80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
4d90: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
4da0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
4db0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4dc0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4dd0: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4de0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4df0: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
4e00: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4e10: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4e20: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4e30: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4e40: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4e50: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
4e60: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
4e70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
4e80: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
4e90: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
4ea0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
4eb0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4ec0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4ed0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4ee0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4ef0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4f00: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4f10: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4f20: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4f30: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4f40: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4f50: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
4f60: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
4f70: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
4f80: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
4f90: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
4fa0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
4fb0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4fc0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4fd0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4fe0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4ff0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
5000: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
5010: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
5020: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
5030: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
5040: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
5050: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
5060: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
5070: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
5080: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
5090: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
50a0: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
50b0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
50c0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
50d0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
50e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
50f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5100: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
5110: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
5120: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5130: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5140: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
5150: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
5160: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
5170: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
5180: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
5190: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
51a0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
51b0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
51c0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
51d0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
51e0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
51f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
5200: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
5210: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
5220: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
5230: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
5240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
5250: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
5260: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
5270: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
5280: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
5290: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
52a0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
52b0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
52c0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
52d0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
52e0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
52f0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
5300: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
5310: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
5320: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
5330: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
5340: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
5350: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5360: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5370: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5380: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
5390: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
53a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
53b0: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
53c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
53d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
53e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
53f0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
5400: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
5410: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
5420: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
5430: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
5440: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5450: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5460: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
5470: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5480: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
5490: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
54a0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
54b0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
54c0: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
54d0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
54e0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
54f0: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
5500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5510: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
5520: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
5530: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
5540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5550: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
5560: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
5570: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
5580: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
5590: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
55a0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
55b0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
55c0: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
55d0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
55e0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
55f0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
5600: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
5610: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5620: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
5630: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
5640: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5650: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
5660: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
5670: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
5680: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
5690: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
56a0: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
56b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
56c0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
56d0: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
56e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
56f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5700: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
5710: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
5720: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
5730: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
5740: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
5750: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
5760: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
5770: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
5780: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
5790: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
57a0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
57b0: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
57c0: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b       if( a==0 ){
57d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
57e0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
57f0: 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20  led ); /* Error 
5800: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
5810: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f   mallocFailed */
5820: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5830: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
5840: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
5850: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
5860: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
5870: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
5880: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
5890: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
58a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
58b0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
58c0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
58d0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
58e0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
58f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5900: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
5910: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
5920: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5930: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
5940: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
5950: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
5960: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
5970: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
5980: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
5990: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
59a0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
59b0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
59c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
59d0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
59e0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
59f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5a00: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
5a10: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
5a20: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
5a30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5a40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
5a50: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
5a60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
5a70: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
5a80: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
5a90: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
5aa0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
5ab0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
5ac0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5ad0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
5ae0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5af0: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5b00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5b10: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
5b20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
5b30: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
5b40: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
5b50: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
5b60: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
5b70: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
5b80: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
5b90: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ght==0 );.    sq
5ba0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5bb0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
5bc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5bd0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
5be0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
5bf0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5c00: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73  EP_MemToken) ) s
5c10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5c20: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
5c30: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5c40: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5c50: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5c60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5c70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5c80: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5c90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5ca0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5cb0: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5cd0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5ce0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
5cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5d00: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
5d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5d20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5d30: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5d40: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5d50: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5d60: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5d70: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5d80: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5d90: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5da0: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5db0: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5dc0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
5dd0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
5de0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5df0: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
5e00: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5e10: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
5e20: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5e30: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5e40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5e50: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5e60: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5e70: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5e80: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5ea0: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5eb0: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5ec0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5ed0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
5ee0: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
5ef0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
5f00: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
5f10: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
5f20: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5f30: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5f40: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5f50: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5f60: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5f70: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5f80: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5f90: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5fa0: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5fb0: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5fc0: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
5fd0: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
5fe0: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
5ff0: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
6000: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
6010: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6060: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
6070: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
6080: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
6090: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
60a0: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
60b0: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
60c0: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
60d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
60e0: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
60f0: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
6100: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
6110: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
6120: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
6130: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
6140: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
6150: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
6160: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
6170: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
6180: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
6190: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
61a0: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
61b0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
61c0: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
61d0: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
61e0: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
61f0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
6200: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
6210: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
6220: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
6230: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
6240: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
6250: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
6260: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
6270: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
6280: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
6290: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
62a0: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
62b0: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
62c0: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
62d0: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
62e0: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
62f0: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
6300: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
6310: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
6320: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
6330: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
6340: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
6350: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
6360: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
6370: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
6380: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
6390: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
63a0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
63b0: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
63c0: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
63d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
63e0: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
63f0: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
6400: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
6410: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
6420: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
6430: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
6440: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
6450: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
6460: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
6470: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
6480: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
6490: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
64a0: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
64b0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
64c0: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
64d0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
64e0: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
64f0: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
6500: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
6510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6520: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6530: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6540: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
6550: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
6560: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
6570: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
6580: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
6590: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
65a0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
65b0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
65c0: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
65d0: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
65e0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
65f0: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
6600: 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52  ( 0==(flags&EXPR
6610: 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20  DUP_REDUCE) ){. 
6620: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
6630: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
6640: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
6650: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6660: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
6670: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
6680: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6690: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66a0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
66b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
66c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
66d0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
66e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
66f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6700: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
6710: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
6720: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
6730: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
6740: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6750: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
6760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6770: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
6780: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
6790: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
67a0: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
67b0: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
67c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
67d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
67e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
67f0: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
6800: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
6810: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
6820: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
6830: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
6840: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
6850: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
6860: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
6870: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
6880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6890: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
68a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
68b0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
68c0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
68d0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
68e0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
68f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6900: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6910: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
6920: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
6930: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6940: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6960: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6970: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6980: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6990: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
69a0: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
69b0: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
69c0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
69d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
69e0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
69f0: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
6a00: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
6a10: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
6a20: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
6a30: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6a40: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6a50: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6a60: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6a70: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6a80: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6a90: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
6aa0: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
6ab0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6ac0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6ad0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6ae0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
6af0: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6b00: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6b10: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6b20: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6b30: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6b40: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6b50: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6b60: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6b70: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6b80: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6b90: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
6ba0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
6bb0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
6bc0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
6bd0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
6be0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6bf0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6c00: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6c10: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6c20: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6c30: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6c40: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6c50: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6c60: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6c70: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6c80: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6c90: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
6ca0: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
6cb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6cc0: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
6cd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ce0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
6cf0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6d00: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6d10: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6d20: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6d30: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6d40: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6d50: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6d60: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6d70: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6d80: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6d90: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
6da0: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
6db0: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
6dc0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
6dd0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
6de0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
6df0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
6e00: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6e10: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
6e20: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
6e30: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
6e40: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
6e50: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
6e60: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
6e80: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
6e90: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
6ea0: 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a  int flags, u8 **
6eb0: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
6ec0: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
6ef0: 74 75 72 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  turn */.  assert
6f00: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
6f10: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6f20: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
6f30: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6f40: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6f50: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6f60: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6f70: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6f80: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6f90: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6fb0: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6fc0: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
6fd0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
6fe0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
6ff0: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
7000: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
7010: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
7020: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
7030: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
7040: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
7050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7060: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
7070: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
7080: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
7090: 65 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20  e(p, flags));.  
70a0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28    }.    pNew = (
70b0: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
70c0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
70d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65        /* Set nNe
70e0: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
70f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
7100: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
7110: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  inted to.      *
7120: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
7130: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
7140: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
7150: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
7160: 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e     ** EXPR_TOKEN
7170: 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e  ONLYSIZE. nToken
7180: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
7190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
71a0: 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a  onsumed.      **
71b0: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
71c0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
71d0: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
71e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
71f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
7200: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
7210: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
7220: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
7230: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
7240: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
7250: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
7260: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20    int nToken;.  
7270: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
7280: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
7290: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
72a0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
72b0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
72c0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
72d0: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
72e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
72f0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20     nToken = 0;. 
7300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7310: 20 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20   isReduced ){.  
7320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
7330: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7340: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
7350: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
7360: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65  y(zAlloc, p, nNe
7370: 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
7380: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32  lse{.        u32
7390: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
73a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
73b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
73c0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
73d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
73e0: 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49  Size<EXPR_FULLSI
73f0: 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ZE ){ .         
7400: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7410: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7420: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7430: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7440: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
7450: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
7460: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
7470: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
7480: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
7490: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
74a0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
74b0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
74c0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
74d0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
74e0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
74f0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
7500: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
7510: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  kenOnly);.      
7520: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
7530: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
7540: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
7550: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
7560: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
7570: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
7580: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
7590: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
75a0: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
75b0: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
75c0: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
75d0: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
75e0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
75f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7600: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
7610: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
7620: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7630: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  .        /* Fill
7640: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
7650: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
7660: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
7670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7680: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7690: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
76a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
76b0: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
76c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
76d0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
76e0: 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20  t, isReduced);. 
76f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7700: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
7710: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
7720: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
7730: 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64  ->x.pList, isRed
7740: 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  uced);.        }
7750: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7760: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
7770: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
7780: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
7790: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
77a0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
77b0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
77c0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
77d0: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
77e0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
77f0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
7800: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
7810: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
7820: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
7830: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
7840: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7850: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
7860: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7870: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7880: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
7890: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
78a0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
78b0: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
78c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
78d0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
78e0: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
78f0: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
7900: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
7910: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
7920: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7930: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
7940: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
7950: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7960: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7970: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7980: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
7990: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
79a0: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
79b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
79c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
79d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
79f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
7a00: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
7a10: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
7a20: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
7a30: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
7a40: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
7a50: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
7a60: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
7a70: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
7a80: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
7a90: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
7aa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7ab0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
7ac0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
7ad0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
7ae0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
7af0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
7b00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7b10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
7b20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
7b30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
7b40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7b50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
7b60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
7b70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7b80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
7b90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
7ba0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
7bb0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
7bc0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
7bd0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7be0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
7bf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
7c00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
7c10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
7c20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7c30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
7c40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7c50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
7c60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7c70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
7c80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7c90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7ca0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
7cb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
7cc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
7cd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
7ce0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
7cf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
7d00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
7d10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
7d20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
7d30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
7d40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
7d50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
7d60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
7d70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
7d80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
7d90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
7da0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
7db0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
7dc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
7dd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7de0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
7df0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
7e00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7e10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
7e20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
7e30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
7e40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
7e50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
7e60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
7e70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
7e80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
7e90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
7ea0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
7eb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
7ec0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
7ed0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
7ee0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
7ef0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
7f00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
7f10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
7f20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
7f30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
7f40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
7f50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
7f60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
7f70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
7f80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
7f90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
7fa0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
7fb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
7fc0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
7fd0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
7fe0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
7ff0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
8000: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
8010: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
8020: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
8030: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
8040: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
8050: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8060: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
8070: 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73  Dup(db, p, flags
8080: 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74  , 0);.}.ExprList
8090: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
80a0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
80b0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
80c0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
80d0: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
80e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
80f0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
8100: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
8110: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
8120: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
8130: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8140: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8150: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
8160: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
8170: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8180: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
8190: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
81a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
81b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
81c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
81d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
81e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
81f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
8200: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
8210: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8220: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8230: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8250: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8260: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8270: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8280: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8290: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
82a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
82b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
82c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
82d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
82e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
82f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8300: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8310: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8320: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8330: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8340: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8350: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8360: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8370: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8380: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8390: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
83a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
83b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
83c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
83d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
83e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
83f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8400: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8410: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8420: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8430: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8440: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8450: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8460: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8470: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8480: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8490: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
84a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
84b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
84c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
84d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
84e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
84f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8500: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8510: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8520: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8530: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8540: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8550: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8560: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8570: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8580: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8590: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
85a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
85b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
85c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
85d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73  int nByte;.  ass
85e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
85f0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8600: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
8610: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
8620: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
8630: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
8640: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
8650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8660: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
8670: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
8680: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
8690: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
86a0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
86b0: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
86c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
86d0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
86e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
86f0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
8700: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
8710: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
8720: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
8730: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
8740: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
8750: 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
8760: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
8770: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
8780: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
8790: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
87a0: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
87b0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
87c0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
87d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
87e0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
87f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
8800: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
8810: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8820: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
8830: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d    pNewItem->fg =
8840: 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20   pOldItem->fg;. 
8850: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
8860: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
8870: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
8880: 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ewItem->addrFill
8890: 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Sub = pOldItem->
88a0: 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20  addrFillSub;.   
88b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65   pNewItem->regRe
88c0: 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  turn = pOldItem-
88d0: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
88e0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
88f0: 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
8900: 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e        pNewItem->
8910: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
8920: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8930: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
8940: 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
8950: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
8960: 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c  ->pIBIndex = pOl
8970: 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b  dItem->pIBIndex;
8980: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
8990: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
89a0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
89b0: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
89c0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
89d0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
89e0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
89f0: 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29  pFuncArg, flags)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
8a10: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8a20: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8a30: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8a40: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8a50: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8a60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8a70: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8a80: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8a90: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
8aa0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
8ab0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
8ac0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
8ad0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
8ae0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
8af0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8b00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8b10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8b20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8b30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8b40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8b50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8b60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8b70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8b80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8b90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8ba0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8bb0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
8bc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8bd0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
8be0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8bf0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
8c00: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
8c10: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8c20: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
8c30: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
8c40: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
8c50: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
8c60: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
8c70: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
8c80: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
8c90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8ca0: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
8cb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
8cc0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
8cd0: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
8ce0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
8cf0: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
8d00: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
8d10: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
8d20: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
8d30: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
8d40: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
8d50: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
8d60: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
8d70: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
8d80: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
8d90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
8da0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
8db0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
8dc0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
8dd0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
8de0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
8df0: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
8e00: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
8e10: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8e20: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
8e30: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
8e40: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
8e50: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
8e60: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
8e70: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
8e80: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
8e90: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
8ea0: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
8eb0: 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pNew, *pPrior;. 
8ec0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
8ed0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8ee0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8ef0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8f00: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
8f10: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8f20: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8f30: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8f40: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8f50: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
8f60: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
8f70: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
8f80: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
8f90: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
8fa0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
8fb0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8fc0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8fd0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8fe0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8ff0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
9000: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
9010: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
9020: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
9030: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9040: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
9050: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
9060: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
9070: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
9080: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
9090: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
90a0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
90b0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
90c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
90d0: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
90e0: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
90f0: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
9100: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
9110: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
9120: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
9130: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9140: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
9150: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
9160: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
9170: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
9180: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
9190: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
91a0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
91b0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
91c0: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
91d0: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
91e0: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
91f0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
9200: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
9210: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
9220: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
9230: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
9240: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
9250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
9260: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
9270: 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  h);.  sqlite3Sel
9280: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
9290: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
92a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
92b0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
92c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
92d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
92e0: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
92f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
9300: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
9310: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
9320: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
9330: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
9340: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
9350: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
9360: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
9370: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
9380: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
9390: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
93a0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
93b0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
93c0: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
93d0: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
93e0: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
93f0: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
9400: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
9410: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
9420: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
9430: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
9440: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
9450: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
9460: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
9470: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
9480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9490: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
94a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
94b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
94c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
94d0: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
94e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
94f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
9500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9510: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
9520: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
9530: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
9540: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9550: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
9560: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
9570: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
9580: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
9590: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
95a0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
95b0: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
95c0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
95d0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
95e0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
95f0: 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 70  nExpr = 0;.    p
9600: 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
9610: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
9620: 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  b, sizeof(pList-
9630: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
9640: 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67   pList->a==0 ) g
9650: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65  oto no_mem;.  }e
9660: 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  lse if( (pList->
9670: 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e  nExpr & (pList->
9680: 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a  nExpr-1))==0 ){.
9690: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
96a0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
96b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
96c0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
96d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
96e0: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
96f0: 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32  , pList->nExpr*2
9700: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
9710: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
9720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
9730: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
9740: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
9750: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9760: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
9770: 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74   if( 1 ){.    st
9780: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9790: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
97a0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
97b0: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
97c0: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
97d0: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
97e0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
97f0: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
9800: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
9810: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
9820: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
9830: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
9840: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
9850: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9860: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
9870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9880: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
9890: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
98a0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
98b0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
98c0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
98d0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
98e0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
98f0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
9900: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
9910: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
9920: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
9930: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
9940: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
9950: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
9960: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
9970: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
9980: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
9990: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
99a0: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
99b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
99c0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
99d0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
99e0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
99f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
9a00: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
9a10: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
9a20: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
9a30: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
9a40: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
9a50: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
9a60: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9a70: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
9a80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9a90: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
9aa0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
9ab0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
9ac0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
9ad0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
9ae0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
9af0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9b00: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
9b10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9b20: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
9b30: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
9b40: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
9b50: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
9b60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9b70: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9b80: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9b90: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
9ba0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
9bb0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
9bc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
9bd0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
9be0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
9bf0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
9c00: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
9c10: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
9c20: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
9c30: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
9c40: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
9c50: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9c60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
9c70: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
9c80: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9c90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9ca0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
9cb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
9cc0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
9cd0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9ce0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
9cf0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
9d00: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
9d10: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
9d20: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
9d30: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
9d40: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
9d50: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70  if( dequote && p
9d60: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71  Item->zName ) sq
9d70: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
9d80: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
9d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9da0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
9db0: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
9dc0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9dd0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
9de0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9df0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
9e00: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9e10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9e20: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
9e30: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
9e40: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9e50: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9e60: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9e70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9e80: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
9e90: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
9ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9eb0: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
9ec0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9ed0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9ee0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9ef0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
9f00: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9f10: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9f20: 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70  pan. */.  ExprSp
9f30: 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20  an *pSpan       
9f40: 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f    /* The span to
9f50: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a   be added */.){.
9f60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9f70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
9f80: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
9f90: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
9fa0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
9fb0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
9fc0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9fd0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
9fe0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
9ff0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
a000: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
a010: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
a020: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a030: 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d  || pItem->pExpr=
a040: 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b  =pSpan->pExpr );
a050: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a060: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
a070: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
a080: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
a090: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
a0a0: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
a0b0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
a0e0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
a0f0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d  n->zStart));.  }
a100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
a110: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a120: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
a130: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
a140: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
a150: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
a160: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
a170: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a180: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
a190: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
a1a0: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
a1b0: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
a1c0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
a1d0: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
a1e0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
a1f0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
a200: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
a210: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
a220: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
a230: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
a240: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
a250: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
a260: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
a270: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
a280: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
a290: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a2a0: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
a2b0: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
a2c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a2d0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
a2e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a2f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a300: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a310: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
a320: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
a330: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
a340: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a350: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
a360: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
a370: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
a380: 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  >a!=0 || pList->
a390: 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f  nExpr==0 );.  fo
a3a0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
a3b0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
a3c0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
a3d0: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
a3e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a3f0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
a400: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a410: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
a420: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
a430: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
a440: 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73  >zSpan);.  }.  s
a450: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a460: 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
a470: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a480: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
a490: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 77   Return the bitw
a4a0: 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78  ise-OR of all Ex
a4b0: 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20  pr.flags fields 
a4c0: 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  in the given.** 
a4d0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32  ExprList..*/.u32
a4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a4f0: 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72  Flags(const Expr
a500: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
a510: 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d  int i;.  u32 m =
a520: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
a530: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
a540: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
a550: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70  i++){.       Exp
a560: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
a570: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
a580: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
a590: 70 45 78 70 72 29 20 29 20 6d 20 7c 3d 20 70 45  pExpr) ) m |= pE
a5a0: 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  xpr->flags;.    
a5b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
a5c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
a5d0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
a5e0: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
a5f0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
a600: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
a610: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
a620: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
a630: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
a640: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
a650: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
a660: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
a670: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
a680: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
a690: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
a6a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
a6b0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
a6c0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
a6d0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
a6e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
a6f0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a700: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
a710: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
a720: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
a730: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a740: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
a750: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
a760: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
a770: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
a780: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
a790: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
a7a0: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
a7b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
a7c0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a7d0: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
a7e0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
a7f0: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
a800: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
a810: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
a820: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
a830: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a840: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
a850: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
a860: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
a870: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a880: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
a890: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
a8a0: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
a8b0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
a8c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a8d0: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
a8e0: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
a8f0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
a900: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
a910: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
a920: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
a930: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
a940: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
a950: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
a960: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
a970: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
a980: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
a990: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
a9a0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
a9b0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
a9c0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
a9d0: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
a9e0: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
a9f0: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
aa00: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
aa10: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
aa20: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
aa30: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
aa40: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
aa50: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
aa60: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
aa70: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
aa80: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
aa90: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
aaa0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
aab0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
aac0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
aad0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
aae0: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
aaf0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
ab00: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
ab10: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
ab20: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ab30: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
ab40: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
ab50: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
ab60: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
ab70: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
ab80: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
ab90: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
aba0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
abb0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
abc0: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
abd0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
abe0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
abf0: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ac00: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ac10: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ac20: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ac30: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
ac40: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
ac50: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
ac60: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
ac70: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ac80: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
ac90: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
aca0: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
acb0: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
acc0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
acd0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
ace0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
acf0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
ad00: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
ad10: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
ad20: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ad30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
ad40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
ad50: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ad60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ad70: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ad80: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ad90: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
ada0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
adb0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
adc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
add0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
ade0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
adf0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
ae00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ae10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
ae20: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
ae30: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ae40: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
ae50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ae60: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ae70: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
ae80: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ae90: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
aea0: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
aeb0: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
aec0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
aed0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
aee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aef0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
af00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
af10: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
af20: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
af30: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
af40: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
af50: 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20  >eCode==5 ){.   
af60: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
af70: 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70   convert bound p
af80: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
af90: 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20  ppear inside of 
afa0: 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a  CREATE.        *
afb0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  * statements int
afc0: 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61  o a NULL when pa
afd0: 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  rsing the CREATE
afe0: 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20   statement text 
aff0: 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  out.        ** o
b000: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
b010: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
b020: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
b030: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
b040: 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65  }else if( pWalke
b050: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20  r->eCode==4 ){. 
b060: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e         /* A boun
b070: 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61  d parameter in a
b080: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
b090: 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
b0a0: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  s from.        *
b0b0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
b0c0: 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72  e() causes an er
b0d0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ror */.        p
b0e0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
b0f0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
b100: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b110: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
b120: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
b130: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
b140: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b150: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
b160: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
b170: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
b180: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
b190: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b1a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
b1b0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
b1c0: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
b1d0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
b1e0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
b1f0: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
b200: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
b210: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
b220: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
b230: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
b240: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
b250: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
b260: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
b270: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
b280: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
b290: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
b2a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
b2b0: 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
b2c0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
b2d0: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
b2e0: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
b2f0: 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b  Code = initFlag;
b300: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
b310: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
b320: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
b330: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
b340: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
b350: 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  ant;.  w.u.iCur 
b360: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
b370: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
b380: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
b390: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
b3a0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b3b0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b3c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b3d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b3e0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
b3f0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
b400: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
b410: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
b420: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
b430: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
b440: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
b450: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
b460: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
b470: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
b480: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
b490: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b4a0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
b4b0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
b4c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
b4d0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
b4e0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
b4f0: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
b500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
b510: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b520: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
b530: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
b540: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
b550: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
b560: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
b570: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
b580: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
b590: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
b5a0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
b5b0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
b5c0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
b5d0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
b5e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
b5f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
b600: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
b610: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
b620: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
b630: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
b640: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
b650: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
b660: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
b670: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
b680: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
b690: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
b6a0: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
b6b0: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
b6c0: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
b6d0: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
b6e0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
b6f0: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
b700: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
b710: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
b720: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
b730: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
b740: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
b750: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
b760: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
b770: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
b780: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
b790: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
b7a0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b7b0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b7c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b7d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b7e0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
b7f0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
b800: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
b810: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
b820: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
b830: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
b840: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
b850: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
b860: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
b870: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
b880: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
b890: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
b8a0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
b8b0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
b8c0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
b8d0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
b8e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b8f0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
b900: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
b910: 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20  , u8 isInit){.  
b920: 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d  assert( isInit==
b930: 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29  0 || isInit==1 )
b940: 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  ;.  return exprI
b950: 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e  sConst(p, 4+isIn
b960: 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65  it, 0);.}..#ifde
b970: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b980: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
b990: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
b9a0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
b9b0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
b9c0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
b9d0: 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
b9e0: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65  f some kind.  Re
b9f0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
ba00: 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65  are no subquerie
ba10: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ba20: 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62  3ExprContainsSub
ba30: 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a  query(Expr *p){.
ba40: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
ba50: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
ba60: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
ba70: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
ba80: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
ba90: 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
baa0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
bab0: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
bac0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
bad0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
bae0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
baf0: 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
bb00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
bb10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
bb20: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
bb30: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
bb40: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
bb50: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
bb60: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
bb70: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
bb80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
bb90: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
bba0: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
bbb0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
bbc0: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
bbd0: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
bbe0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
bbf0: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
bc00: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
bc10: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
bc20: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
bc30: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
bc40: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
bc50: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
bc60: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
bc70: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
bc80: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
bc90: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
bca0: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
bcb0: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
bcc0: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
bcd0: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
bce0: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
bcf0: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
bd00: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
bd10: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
bd20: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
bd30: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
bd40: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
bd50: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
bd60: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
bd70: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
bd80: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
bd90: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
bda0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
bdb0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
bdc0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
bdd0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
bde0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
bdf0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
be00: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
be10: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
be20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
be30: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
be40: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
be50: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
be60: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
be70: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
be80: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
be90: 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
bea0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
beb0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
bec0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
bed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bee0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
bef0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
bf00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bf10: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
bf20: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
bf30: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
bf40: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
bf50: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
bf60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
bf70: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
bf80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
bf90: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
bfa0: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
bfb0: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
bfc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
bfd0: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
bfe0: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
bff0: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
c000: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
c010: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
c020: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
c030: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
c040: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
c050: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
c060: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
c070: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
c080: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
c090: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
c0a0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
c0b0: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
c0c0: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
c0d0: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
c0e0: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
c0f0: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
c100: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
c110: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
c120: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
c130: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
c140: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
c150: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
c160: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
c170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
c180: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
c190: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
c1a0: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
c1b0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
c1c0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
c1d0: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
c1e0: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
c1f0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
c200: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
c210: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
c220: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
c230: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
c240: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
c250: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
c260: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
c270: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
c280: 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
c290: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
c2a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
c2b0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  !=0 );.      ret
c2c0: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
c2d0: 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
c2e0: 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
c2f0: 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
c300: 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
c310: 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
c320: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
c330: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
c340: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
c350: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
c360: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
c370: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c380: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
c390: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
c3a0: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
c3b0: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
c3c0: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
c3d0: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
c3e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
c3f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
c400: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c410: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
c420: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
c430: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
c440: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
c450: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
c460: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
c470: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
c480: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
c490: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
c4a0: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
c4b0: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
c4c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
c4d0: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
c4e0: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
c4f0: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
c500: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
c510: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
c520: 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
c530: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
c540: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
c550: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
c560: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
c570: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
c580: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
c590: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
c5a0: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
c5b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
c5c0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
c5d0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
c5e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
c5f0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
c600: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
c610: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
c620: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
c630: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
c640: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
c650: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c660: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
c670: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
c680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
c690: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
c6a0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
c6b0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
c6c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
c6d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
c6e0: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
c6f0: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
c700: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
c710: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
c720: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
c730: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
c740: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
c750: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
c760: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
c770: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
c780: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
c790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
c7a0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
c7b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
c7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c7d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
c7e0: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
c7f0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
c800: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
c810: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
c820: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
c830: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
c840: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
c850: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
c860: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c870: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
c880: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
c890: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c8a0: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
c8b0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
c8c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
c8d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
c8e0: 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20  are able to the 
c8f0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69  IN operator opti
c900: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a  mization on a.**
c910: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
c920: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78  rm.**.**       x
c930: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
c940: 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65  .**.** Where the
c950: 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73   SELECT... claus
c960: 65 20 69 73 20 61 73 20 73 70 65 63 69 66 69 65  e is as specifie
c970: 64 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74  d by the paramet
c980: 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f  er to this.** ro
c990: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
c9a0: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70   Select object p
c9b0: 61 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72  assed in has alr
c9c0: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f  eady been prepro
c9d0: 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a  cessed and no.**
c9e0: 20 65 72 72 6f 72 73 20 68 61 76 65 20 62 65 65   errors have bee
c9f0: 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e  n found..*/.#ifn
ca00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ca10: 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
ca20: 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65 46  int isCandidateF
ca30: 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a  orInOpt(Select *
ca40: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
ca50: 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
ca60: 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65  *pEList;.  Table
ca70: 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d   *pTab;.  if( p=
ca80: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73   /* right-hand s
cab0: 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c  ide of IN is SEL
cac0: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
cad0: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
cae0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
caf0: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
cb00: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
cb10: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
cb20: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
cb30: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
cb40: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
cb50: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
cb60: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
cb70: 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
cb80: 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
cb90: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
cba0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
cbb0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
cbc0: 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
cbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
cbe0: 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
cbf0: 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
cc00: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
cc10: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
cc20: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
cc30: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
cc40: 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
cc50: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
cc60: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
cc70: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
cc80: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
cc90: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
cca0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
ccb0: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
ccc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
ccd0: 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
cce0: 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
ccf0: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
cd00: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
cd10: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
cd20: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
cd30: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
cd40: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
cd50: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
cd60: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
cd70: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
cd80: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
cd90: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
cda0: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
cdb0: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
cdc0: 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
cdd0: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
cde0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
cdf0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
ce00: 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  Tab;.  if( NEVER
ce10: 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75  (pTab==0) ) retu
ce20: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
ce30: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
ce40: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
ce50: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
ce60: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
ce70: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
ce80: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
ce90: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
cea0: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
ceb0: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
cec0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
ced0: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
cee0: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
cef0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  urn 0;       /* 
cf00: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  One column in th
cf10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
cf20: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
cf30: 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
cf40: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
cf50: 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73   0; /* Result is
cf60: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72   a column */.  r
cf70: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
cf80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cf90: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
cfa0: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f  .** Code an OP_O
cfb0: 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
cfc0: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  and allocate spa
cfd0: 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e  ce for its flag.
cfe0: 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20   Return the .** 
cff0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
d000: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
d010: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
d020: 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50  deOnce(Parse *pP
d030: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
d040: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d050: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  e(pParse);      
d060: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
d070: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
d080: 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
d090: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d0a0: 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d  OP_Once, pParse-
d0b0: 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a  >nOnce++);.}../*
d0c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d0d0: 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
d0e0: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
d0f0: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
d100: 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
d110: 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
d120: 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
d130: 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
d140: 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
d150: 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
d160: 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
d170: 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
d180: 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
d190: 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
d1a0: 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
d1b0: 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
d1c0: 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
d1d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
d1e0: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
d1f0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
d200: 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
d210: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
d220: 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
d230: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
d240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d250: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d260: 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
d270: 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
d280: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d290: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
d2a0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
d2b0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
d2c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d2d0: 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
d2e0: 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
d2f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d300: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
d310: 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
d320: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
d330: 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
d340: 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
d350: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d360: 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 0a 0a 23 69  , addr1);.}...#i
d370: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d380: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
d390: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
d3a0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
d3b0: 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
d3c0: 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
d3d0: 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
d3e0: 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
d3f0: 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
d400: 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
d410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
d420: 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
d430: 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
d440: 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
d450: 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
d460: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
d470: 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
d480: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
d490: 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
d4a0: 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
d4b0: 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
d4c0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
d4d0: 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
d4e0: 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
d4f0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
d500: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
d510: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
d520: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
d530: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
d540: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
d550: 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
d560: 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
d570: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
d580: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d590: 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
d5a0: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
d5b0: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d5c0: 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
d5d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
d5e0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
d5f0: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
d600: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
d610: 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
d620: 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
d630: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
d640: 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
d650: 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
d660: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
d670: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
d680: 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
d690: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
d6a0: 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
d6b0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
d6c0: 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
d6d0: 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
d6e0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d6f0: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
d700: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
d710: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
d720: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
d730: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
d740: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
d750: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
d760: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
d770: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
d780: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
d790: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
d7a0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d7b0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
d7c0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
d7d0: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
d7e0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
d7f0: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
d800: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
d810: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
d820: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
d830: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
d840: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
d850: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
d860: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
d870: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
d880: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
d890: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
d8c0: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
d8d0: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
d8e0: 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
d8f0: 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
d900: 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
d910: 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
d920: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d930: 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
d940: 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
d950: 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
d960: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
d970: 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
d980: 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
d990: 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
d9a0: 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
d9b0: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
d9c0: 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
d9d0: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
d9e0: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
d9f0: 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
da00: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
da10: 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
da20: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
da30: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
da40: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
da50: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
da60: 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
da70: 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
da80: 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
da90: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
daa0: 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
dab0: 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
dac0: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
dad0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
dae0: 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
daf0: 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
db00: 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
db10: 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
db20: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
db30: 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
db40: 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
db50: 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
db60: 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
db70: 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
db80: 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
db90: 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
dba0: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
dbb0: 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
dbc0: 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
dbd0: 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
dbe0: 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
dbf0: 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
dc00: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
dc10: 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
dc20: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
dc30: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
dc40: 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
dc50: 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
dc60: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
dc70: 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
dc80: 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
dc90: 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
dca0: 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
dcb0: 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
dcc0: 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
dcd0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
dce0: 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
dcf0: 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20  lected <column> 
dd00: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
dd10: 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
dd20: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
dd30: 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
dd40: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69  PRIMARY KEY or i
dd50: 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55  t.** has a UNIQU
dd60: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
dd70: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a  UNIQUE index..**
dd80: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
dd90: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
dda0: 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
ddb0: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
ddc0: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
ddd0: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
dde0: 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
ddf0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
de00: 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
de10: 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  less <column> is
de20: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
de30: 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e  ARY KEY or an in
de40: 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66  dex can .** be f
de50: 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d  ound with <colum
de60: 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  n> as its left-m
de70: 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  ost column..**.*
de80: 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
de90: 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
dea0: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
deb0: 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
dec0: 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
ded0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
dee0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
def0: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
df00: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
df10: 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
df20: 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
df30: 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
df40: 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
df50: 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
df60: 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
df70: 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
df80: 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
df90: 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
dfa0: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
dfb0: 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
dfc0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
dfd0: 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
dfe0: 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
dff0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
e000: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
e010: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
e020: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
e030: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
e040: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
e050: 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
e060: 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
e070: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
e080: 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
e090: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
e0a0: 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
e0b0: 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
e0c0: 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
e0d0: 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
e0e0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
e0f0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
e100: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
e110: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
e120: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
e130: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
e140: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
e150: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
e160: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
e170: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
e180: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
e190: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
e1a0: 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
e1b0: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
e1c0: 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
e1d0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
e1e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
e1f0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
e200: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
e210: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
e220: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
e230: 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
e240: 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
e250: 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
e260: 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
e270: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
e280: 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
e290: 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
e2a0: 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
e2b0: 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
e2c0: 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
e2d0: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
e2e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e2f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
e300: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
e310: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
e320: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75  rse, Expr *pX, u
e330: 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20  32 inFlags, int 
e340: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a  *prRhsHasNull){.
e350: 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
e380: 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
e390: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
e3a0: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
e3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
e3d0: 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
e3e0: 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
e3f0: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
e400: 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
e410: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
e420: 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
e430: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
e440: 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
e450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
e460: 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
e470: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
e480: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e490: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
e4a0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
e4b0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
e4c0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
e4d0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
e4e0: 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65  ;.  mustBeUnique
e4f0: 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e   = (inFlags & IN
e500: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b  _INDEX_LOOP)!=0;
e510: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
e520: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
e530: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
e540: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
e550: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
e560: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
e570: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
e580: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
e590: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
e5a0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70   table..  */.  p
e5b0: 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65   = (ExprHasPrope
e5c0: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
e5d0: 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53  lect) ? pX->x.pS
e5e0: 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66  elect : 0);.  if
e5f0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
e600: 30 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65  0 && isCandidate
e610: 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20  ForInOpt(p) ){. 
e620: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
e630: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
e640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e650: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e660: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
e670: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e690: 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
e6a0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
e6b0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f  * Expression <co
e6e0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36  lumn> */.    i16
e6f0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
e720: 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  column <column> 
e730: 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e760: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
e770: 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61  r pTab */..    a
e780: 73 73 65 72 74 28 20 70 20 29 3b 20 20 20 20 20  ssert( p );     
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
e7b0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e7c0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
e7d0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e7e0: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
e7f0: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
e800: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e810: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
e820: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e830: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
e840: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
e850: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e860: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
e870: 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
e880: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
e890: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
e8a0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e8b0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
e8c0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
e8d0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45  [0].pTab;.    pE
e8e0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
e8f0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
e900: 20 69 43 6f 6c 20 3d 20 28 69 31 36 29 70 45 78   iCol = (i16)pEx
e910: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
e920: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
e930: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61  OP_Transaction a
e940: 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
e950: 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
e960: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e970: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
e980: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
e990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
e9a0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
e9b0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
e9c0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
e9d0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
e9e0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
e9f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
ea00: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
ea10: 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
ea20: 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73   from two places
ea30: 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20  . In both cases 
ea40: 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20  the vdbe.    ** 
ea50: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ea60: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61   allocated. So a
ea70: 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74  ssume sqlite3Get
ea80: 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73  Vdbe() is always
ea90: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
eaa0: 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ul here..    */.
eab0: 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20      assert(v);. 
eac0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
ead0: 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
eae0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
eaf0: 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ce(pParse);.    
eb00: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
eb10: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
eb20: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
eb30: 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
eb40: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
eb50: 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
eb60: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
eb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eb80: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
eb90: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
eba0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
ebb0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ebd0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
ebe0: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
ebf0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
ec00: 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65  ence used by the
ec10: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20   comparison. If 
ec20: 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20  an index is to. 
ec30: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
ec40: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
ec50: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
ec60: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
ec70: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
ec80: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
ec90: 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  n sequence.  */.
eca0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
ecb0: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
ecc0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
ecd0: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
ece0: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
ecf0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ed00: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
ed10: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
ed20: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
ed30: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
ed40: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
ed50: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
ed60: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
ed70: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
ed80: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
ed90: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
eda0: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
edb0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
edc0: 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
edd0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
ede0: 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61 43  yOk(pX, pTab->aC
edf0: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
ee00: 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  y);..      for(p
ee10: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
ee20: 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d  ; pIdx && eType=
ee30: 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  =0 && affinity_o
ee40: 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  k; pIdx=pIdx->pN
ee50: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
ee60: 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ( (pIdx->aiColum
ee70: 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20  n[0]==iCol).    
ee80: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46       && sqlite3F
ee90: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
eea0: 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a  NC(db), pIdx->az
eeb0: 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65  Coll[0], 0)==pRe
eec0: 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21  q.         && (!
eed0: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20  mustBeUnique || 
eee0: 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d  (pIdx->nKeyCol==
eef0: 31 20 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64  1 && IsUniqueInd
ef00: 65 78 28 70 49 64 78 29 29 29 0a 20 20 20 20 20  ex(pIdx))).     
ef10: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
ef20: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
ef30: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
ef40: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
ef50: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
ef60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ef70: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
ef80: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
ef90: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
efa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
efb0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
efc0: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
efd0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
efe0: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
eff0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
f000: 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
f010: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
f020: 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
f030: 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
f040: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
f050: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
f060: 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
f070: 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20  er[0];..        
f080: 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
f090: 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  ll && !pTab->aCo
f0a0: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
f0b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
f0c0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
f0d0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f0f0: 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
f100: 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
f110: 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
f120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f130: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f140: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
f150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f170: 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
f180: 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
f190: 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
f1a0: 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
f1b0: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
f1c0: 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
f1d0: 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
f1e0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
f1f0: 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
f200: 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
f210: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
f220: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 6e 74  S is not contant
f230: 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
f240: 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
f250: 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
f260: 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
f270: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
f280: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
f290: 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
f2a0: 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
f2b0: 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
f2c0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
f2d0: 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
f2e0: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
f2f0: 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
f300: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
f310: 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
f320: 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
f330: 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
f340: 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
f350: 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
f360: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
f370: 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20  EX_NOOP;.  }.   
f380: 20 20 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d    ..  if( eType=
f390: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
f3a0: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
f3b0: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
f3c0: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
f3d0: 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
f3e0: 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
f3f0: 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
f400: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
f410: 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
f420: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
f430: 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
f440: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
f450: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
f460: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
f470: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
f480: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
f490: 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
f4a0: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
f4b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
f4c0: 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
f4d0: 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
f4e0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
f4f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f500: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
f510: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
f520: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
f530: 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
f540: 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
f550: 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
f560: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
f570: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
f580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f590: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f5a0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
f5b0: 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
f5c0: 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
f5d0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
f5e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
f5f0: 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
f600: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
f610: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
f620: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
f630: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
f640: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
f650: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f660: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
f670: 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
f680: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
f690: 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
f6a0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
f6b0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
f6c0: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
f6d0: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
f6e0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
f6f0: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
f700: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
f710: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
f720: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
f730: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
f740: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
f750: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
f760: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
f770: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
f780: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
f790: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
f7a0: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
f7b0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
f7c0: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
f7d0: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
f7e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
f7f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
f800: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
f810: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
f820: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
f830: 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
f840: 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
f850: 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
f860: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
f870: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
f880: 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
f890: 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
f8a0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
f8b0: 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
f8c0: 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
f8d0: 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
f8e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
f8f0: 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
f900: 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
f910: 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
f920: 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
f930: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
f940: 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
f950: 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
f960: 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
f970: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
f980: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
f990: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
f9a0: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
f9b0: 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
f9c0: 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
f9d0: 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
f9e0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
f9f0: 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73  LLs..** All this
fa00: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
fa10: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
fa20: 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
fa30: 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a  y rMayHaveNull.*
fa40: 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  * to NULL.  Call
fa50: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
fa60: 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63  l take care of c
fa70: 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
fa80: 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74  ister.** value t
fa90: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
faa0: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
fab0: 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ee..**.** For a 
fac0: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
fad0: 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
fae0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
faf0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
fb00: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e   result.  For IN
fb10: 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
fb20: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
fb30: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
fb40: 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e  ue is 0..*/.#ifn
fb50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb60: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
fb70: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
fb80: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
fb90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
fba0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
fbb0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
fbc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
fbd0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
fbe0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
fbf0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73  or */.  int rHas
fc00: 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20  NullFlag,       
fc10: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
fc20: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
fc30: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
fc40: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
fc50: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
fc60: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
fc70: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
fc80: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
fc90: 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61  .  int jmpIfDyna
fca0: 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  mic = -1;       
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcc0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
fcd0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
fce0: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
fd10: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
fd20: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
fd30: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fd40: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
fd50: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
fd60: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
fd70: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
fd80: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
fd90: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
fda0: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
fdb0: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
fdc0: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
fdd0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
fde0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
fdf0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
fe00: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
fe10: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
fe20: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
fe30: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
fe40: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
fe50: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
fe60: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
fe70: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
fe80: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
fe90: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
fea0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
feb0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
fec0: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
fed0: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
fee0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
fef0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
ff00: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
ff10: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
ff20: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
ff30: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
ff40: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
ff50: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ff60: 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
ff70: 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
ff80: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
ff90: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
ffa0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
ffb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ffc0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
ffd0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
ffe0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
fff0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
10000 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
10010 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25  db, "EXECUTE %s%
10020 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a  s SUBQUERY %d",.
10030 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
10040 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52  amic>=0?"":"CORR
10050 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20  ELATED ",.      
10060 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
10070 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41  IN?"LIST":"SCALA
10080 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72  R",.        pPar
10090 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
100a0 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
100b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
100c0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
100d0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
100e0 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
100f0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65  DYNAMIC);.  }.#e
10100 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20  ndif..  switch( 
10110 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
10120 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
10130 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
10140 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
10150 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
10160 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
10170 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  N */.      int a
10180 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
10190 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
101a0 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
101b0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
101c0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
101d0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
101e0 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
101f0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
10200 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65  ator */.      Ke
10210 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
10220 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
10230 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
10240 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
10250 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
10260 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20  inity(pLeft);.. 
10270 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
10280 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
10290 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
102a0 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
102b0 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
102c0 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
102d0 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
102e0 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65   way.  An epheme
102f0 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ral table is .  
10300 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
10310 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20  th single-field 
10320 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
10330 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
10340 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  lts.      ** fro
10350 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20  m the SELECT or 
10360 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
10370 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10380 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
10390 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
103a0 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
103b0 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
103c0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
103d0 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
103e0 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
103f0 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
10400 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
10410 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
10420 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
10430 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
10440 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
10450 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
10460 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
10470 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
10480 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
10490 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
104a0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
104b0 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
104c0 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
104d0 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
104e0 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
104f0 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
10500 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
10510 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
10520 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
10530 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10540 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
10550 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10560 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10580 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
10590 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
105a0 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20  le, !isRowid);. 
105b0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
105c0 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71  isRowid ? 0 : sq
105d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
105e0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 31 2c  c(pParse->db, 1,
105f0 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
10600 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
10610 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
10620 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
10630 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
10640 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
10650 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
10660 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
10670 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
10680 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
10690 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
106a0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
106b0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
106c0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
106d0 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
106e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
106f0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
10700 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
10710 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  ;.        Select
10720 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
10730 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
10740 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
10750 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
10760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10770 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
10780 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
10790 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
107a0 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66          dest.aff
107b0 53 64 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e  Sdst = (u8)affin
107c0 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
107d0 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
107e0 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
107f0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
10800 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65 63  ;.        pSelec
10810 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  t->iLimit = 0;. 
10820 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
10830 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61   pSelect->selFla
10840 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
10850 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
10860 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
10870 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
10880 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
10890 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
108a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
108b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
108c0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
108d0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
108e0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
108f0 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
10900 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10910 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
10920 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
10930 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
10940 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10950 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f  pKeyInfo!=0 ); /
10960 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65  * OOM will cause
10970 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c 69   exit after sqli
10980 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20  te3Select() */. 
10990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
109a0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
109b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
109c0 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
109d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
109e0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
109f0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
10a00 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  o) );.        pK
10a10 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
10a20 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
10a30 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
10a40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10a50 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
10a90 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
10aa0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
10ab0 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
10ac0 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
10ad0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
10ae0 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
10af0 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
10b00 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
10b10 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
10b20 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
10b30 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
10b40 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
10b50 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
10b60 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
10b70 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
10b80 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
10b90 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
10ba0 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
10bb0 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
10bc0 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
10bd0 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
10be0 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
10bf0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
10c00 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
10c10 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
10c20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
10c30 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
10c40 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
10c50 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
10c60 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
10c70 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
10c80 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
10c90 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r3;..        if(
10ca0 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
10cb0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
10cc0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
10cd0 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OB;.        }.  
10ce0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
10cf0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
10d00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
10d10 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
10d20 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
10d30 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
10d40 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
10d50 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10d60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10d70 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
10d80 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  }..        /* Lo
10d90 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
10da0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
10db0 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
10dc0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
10dd0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
10de0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
10df0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
10e00 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
10e10 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
10e20 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
10e30 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
10e40 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   0, r2);.       
10e50 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
10e60 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
10e70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
10e80 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
10e90 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
10ea0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
10eb0 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54         int iValT
10ec0 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20  oIns;..         
10ed0 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
10ee0 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
10ef0 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
10f00 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
10f10 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
10f20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
10f30 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
10f40 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
10f50 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
10f60 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
10f70 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
10f80 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
10f90 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
10fa0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
10fb0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
10fc0 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
10fd0 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
10fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
10ff0 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d  ( jmpIfDynamic>=
11000 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
11010 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
11020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11030 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11040 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66  eToNoop(v, jmpIf
11050 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20  Dynamic);.      
11060 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d        jmpIfDynam
11070 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ic = -1;.       
11080 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
11090 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
110a0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
110b0 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
110c0 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
110d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
110e0 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33  Rowid && sqlite3
110f0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
11100 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29  2, &iValToIns) )
11110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
11120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11130 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c  v, OP_InsertInt,
11140 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
11150 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a  r2, iValToIns);.
11160 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
11170 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20  .            r3 
11180 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
11190 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
111a0 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
111b0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
111c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
111d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
111e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
111f0 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20  eInt, r3,.      
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11220 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11230 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)+2);.        
11240 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
11250 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
11260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11270 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
11280 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
11290 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
112a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
112c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
112d0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
112e0 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
112f0 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
11300 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11310 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
11320 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
11330 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
11340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11350 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11360 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
11370 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
11380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
113b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
113c0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
113d0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
113e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
113f0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
11400 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
11410 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  fo ){.        sq
11420 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11430 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
11440 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
11450 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
11460 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11470 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
11480 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
11490 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
114a0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
114b0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
114c0 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
114d0 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
114e0 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
114f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
11500 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
11510 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
11520 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
11530 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
11540 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
11550 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
11560 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
11570 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
11580 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
11590 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
115a0 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
115b0 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
115c0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
115d0 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
115e0 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
115f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11600 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
11630 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
11640 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
11650 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
11680 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72  al with SELECt r
11690 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20  esult */..      
116a0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
116b0 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
116c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
116d0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
116e0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
116f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11700 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20  p==TK_EXISTS || 
11710 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
11720 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61  LECT );..      a
11730 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
11740 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
11750 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
11760 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
11770 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
11780 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
11790 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
117a0 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
117b0 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
117c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
117d0 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
117e0 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
117f0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73  Mem;.        des
11800 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  t.iSdst = dest.i
11810 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20  SDParm;.        
11820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11830 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
11840 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
11850 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
11860 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
11870 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
11880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11890 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
118a0 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
118b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
118c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
118d0 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
118e0 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
118f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
11900 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20  v, "Init EXISTS 
11910 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
11920 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11930 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
11940 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69  e->db, pSel->pLi
11950 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
11960 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
11970 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
11980 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
11990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54      &sqlite3IntT
119c0 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20  okens[1]);.     
119d0 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20   pSel->iLimit = 
119e0 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73  0;.      pSel->s
119f0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d  elFlags &= ~SF_M
11a00 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20  ultiValue;.     
11a10 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
11a20 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
11a30 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
11a40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
11a50 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20     }.      rReg 
11a60 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
11a70 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
11a80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
11a90 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
11aa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11ab0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73  .  }..  if( rHas
11ac0 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20  NullFlag ){.    
11ad0 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
11ae0 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e  lFlag(v, pExpr->
11af0 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c  iTable, rHasNull
11b00 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Flag);.  }..  if
11b10 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d  ( jmpIfDynamic>=
11b20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11b30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11b40 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20  jmpIfDynamic);. 
11b50 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
11b60 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
11b70 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67  ;..  return rReg
11b80 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11b90 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11ba0 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  RY */..#ifndef S
11bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11bc0 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
11bd0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49  te code for an I
11be0 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  N expression..**
11bf0 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53  .**      x IN (S
11c00 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20  ELECT ...).**   
11c10 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20     x IN (value, 
11c20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  value, ...).**.*
11c30 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  * The left-hand 
11c40 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20  side (LHS) is a 
11c50 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
11c60 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68 61  n.  The right-ha
11c70 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a  nd side (RHS).**
11c80 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
11c90 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c  zero or more val
11ca0 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65 73  ues.  The expres
11cb0 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  sion is true if 
11cc0 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f  the LHS is.** co
11cd0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
11ce0 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c  he RHS.  The val
11cf0 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ue of the expres
11d00 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20  sion is unknown 
11d10 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65  (NULL).** if the
11d20 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20   LHS is NULL or 
11d30 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  if the LHS is no
11d40 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  t contained with
11d50 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  in the RHS and t
11d60 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69  he.** RHS contai
11d70 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
11d80 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a  ULL values..**.*
11d90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
11da0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
11db0 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74  at jumps to dest
11dc0 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c  IfFalse if the L
11dd0 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  HS is not .** co
11de0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
11df0 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20  he RHS.  If due 
11e00 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e  to NULLs we cann
11e10 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  ot determine if 
11e20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f  the LHS.** is co
11e30 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
11e40 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  HS then jump to 
11e50 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20  destIfNull.  If 
11e60 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
11e70 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ined.** within t
11e80 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c  he RHS then fall
11e90 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61   through..*/.sta
11ea0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11eb0 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
11ec0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11ed0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
11ee0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
11ef0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11f00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
11f10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
11f20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
11f30 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
11f40 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
11f50 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
11f60 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
11f70 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
11f80 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
11f90 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
11fa0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
11fb0 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
11fc0 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
11fd0 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
11fe0 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
11ff0 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
12000 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
12010 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68  L values */.  ch
12020 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
12030 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
12040 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  n affinity to us
12050 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  e */.  int eType
12060 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12070 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20  Type of the RHS 
12080 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20  */.  int r1;    
12090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
120a0 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
120b0 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ster */.  Vdbe *
120c0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
120d0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64  /* Statement und
120e0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
120f0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
12100 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65   the RHS.   Afte
12110 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65  r this step, the
12120 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
12130 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69  or.  ** pExpr->i
12140 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61  Table will conta
12150 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
12160 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
12170 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  RHS..  */.  v = 
12180 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
12190 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
121a0 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65         /* OOM de
121b0 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20  tected prior to 
121c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  this routine */.
121d0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
121e0 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
121f0 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65  expr"));.  eType
12200 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
12210 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
12220 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45    IN_INDEX_MEMBE
12250 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58  RSHIP | IN_INDEX
12260 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20  _NOOP_OK,.      
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61 6c         destIfFal
12290 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f  se==destIfNull ?
122a0 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c   0 : &rRhsHasNul
122b0 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  l);..  /* Figure
122c0 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
122d0 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
122e0 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
122f0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f  e results.  ** o
12300 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
12310 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
12320 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
12330 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
12340 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f  r.  ** P4 of OP_
12350 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f  MakeRecord..  */
12360 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f  .  affinity = co
12370 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
12380 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43  (pExpr);..  /* C
12390 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65  ode the LHS, the
123a0 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
123b0 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a  xpr> IN (...)"..
123c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
123d0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
123e0 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  se);.  r1 = sqli
123f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12400 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
12410 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
12420 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72   pExpr->pLeft, r
12430 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c  1);..  /* If sql
12440 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
12450 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f  ) did not find o
12460 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  r create an inde
12470 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73  x that is.  ** s
12480 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c  uitable for eval
12490 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70  uating the IN op
124a0 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61  erator, then eva
124b0 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20  luate using a.  
124c0 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ** sequence of c
124d0 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f  omparisons..  */
124e0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
124f0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
12500 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
12510 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
12520 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
12530 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
12540 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
12550 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12560 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
12570 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
12580 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
12590 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f     int r2, regTo
125a0 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65  Free;.    int re
125b0 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  gCkNull = 0;.   
125c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73   int ii;.    ass
125d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
125e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
125f0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
12600 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
12610 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  !=destIfFalse ){
12620 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c  .      regCkNull
12630 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
12640 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
12650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12660 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41  ddOp3(v, OP_BitA
12670 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72 65 67 43  nd, r1, r1, regC
12680 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  kNull);.    }.  
12690 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
126a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  List->nExpr; ii+
126b0 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  +){.      r2 = s
126c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
126d0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  mp(pParse, pList
126e0 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26  ->a[ii].pExpr, &
126f0 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
12700 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
12710 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
12720 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
12730 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
12740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12750 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
12760 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
12770 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
12780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12790 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
127a0 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
127b0 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
127c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
127d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
127e0 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62 65   OP_Eq, r1, labe
127f0 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lOk, r2,.       
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
12820 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
12830 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12840 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74  geIf(v, ii<pList
12850 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
12860 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12870 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d  If(v, ii==pList-
12880 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
12890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
128a0 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69  angeP5(v, affini
128b0 74 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ty);.      }else
128c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
128d0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
128e0 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20  stIfFalse );.   
128f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12900 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
12910 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65   r1, destIfFalse
12920 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20  , r2,.          
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34  (void*)pColl, P4
12950 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43  _COLLSEQ); VdbeC
12960 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12980 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e  hangeP5(v, affin
12990 69 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  ity | SQLITE_JUM
129a0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
129b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
129c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
129d0 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29  arse, regToFree)
129e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
129f0 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20  regCkNull ){.   
12a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
12a20 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65  l, regCkNull, de
12a30 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
12a40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12a60 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
12a70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
12a80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
12a90 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
12aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
12ab0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
12ac0 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
12ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
12ae0 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  /* If the LHS is
12af0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
12b00 72 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72  result is either
12b10 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64   false or NULL d
12b20 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
12b30 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52  on whether the R
12b40 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e  HS is empty or n
12b50 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ot, respectively
12b60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12b70 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
12b80 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65  eNull(pExpr->pLe
12b90 66 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ft) ){.      if(
12ba0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
12bb0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
12bc0 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20      /* Shortcut 
12bd0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
12be0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61  ase where the fa
12bf0 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74  lse and NULL out
12c00 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 20 20  comes are.      
12c10 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a    ** the same. *
12c20 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
12c30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12c40 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65  P_IsNull, r1, de
12c50 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
12c60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12c80 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
12c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12ca0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
12cb0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12cc0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
12cd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12ce0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
12cf0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
12d00 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
12d10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12d20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12d30 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
12d40 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
12d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12d60 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
12d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12d80 20 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d   .    if( eType=
12d90 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
12da0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
12db0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
12dc0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
12dd0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20  f table b-tree. 
12de0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
12df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12e00 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
12e10 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65   r1, destIfFalse
12e20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12e30 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
12e40 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12e50 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78  P_NotExists, pEx
12e60 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
12e70 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20  IfFalse, r1);.  
12e80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12e90 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
12ea0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
12eb0 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
12ec0 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  s an index b-tre
12ed0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
12ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12ef0 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
12f00 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61  ty, r1, 1, 0, &a
12f10 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 0a  ffinity, 1);.  .
12f20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
12f30 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
12f40 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
12f50 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12f60 65 20 0a 20 20 20 20 20 20 2a 2a 20 22 78 20 49  e .      ** "x I
12f70 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73  N (...)" express
12f80 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68  ion must be eith
12f90 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66  er 0 or NULL. If
12fa0 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 2a   the set.      *
12fb0 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  * contains no NU
12fc0 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
12fd0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e  the result is 0.
12fe0 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20 20   If the set .   
12ff0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f     ** contains o
13000 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
13010 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
13020 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
13030 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
13040 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  on is also NULL.
13050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13060 61 73 73 65 72 74 28 20 64 65 73 74 49 66 46 61  assert( destIfFa
13070 6c 73 65 21 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse!=destIfNull 
13080 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d  || rRhsHasNull==
13090 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  0 );.      if( r
130a0 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b  RhsHasNull==0 ){
130b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
130c0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
130d0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
130e0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74  ompile time that
130f0 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20 20   the RHS.       
13100 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61   ** cannot conta
13110 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  in NULL values. 
13120 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20  This happens as 
13130 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
13140 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20     ** of a "NOT 
13150 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
13160 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13170 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 20   schema..       
13180 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
13190 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61  lso run this bra
131a0 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65  nch if NULL is e
131b0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c  quivalent to FAL
131c0 53 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  SE.        ** fo
131d0 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61  r this particula
131e0 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  r IN operator.. 
131f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13210 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
13220 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
13230 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
13240 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  e, r1, 1);.     
13250 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13260 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
13270 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
13280 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20  his branch, the 
13290 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69  RHS of the IN mi
132a0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
132b0 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  LL and.        *
132c0 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  * the presence o
132d0 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20  f a NULL on the 
132e0 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66  RHS makes a diff
132f0 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20  erence in the.  
13300 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65        ** outcome
13310 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13320 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a       int addr1;.
13330 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69    .        /* Fi
13340 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
13350 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   if the LHS is c
13360 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13370 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20  RHS.  If so,.   
13380 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
13390 20 61 6e 73 77 65 72 20 69 73 20 54 52 55 45 20   answer is TRUE 
133a0 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
133b0 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
133c0 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a   does.        **
133d0 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66   not matter.  If
133e0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
133f0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
13400 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20   RHS, then the. 
13410 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72         ** answer
13420 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
13430 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
13440 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65  Ls and the answe
13450 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  r is.        ** 
13460 46 41 4c 53 45 20 69 66 20 74 68 65 20 52 48 53  FALSE if the RHS
13470 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20   is NULL-free.. 
13480 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13490 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
134a0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
134b0 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
134c0 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
134d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
134e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
134f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13510 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  sNull, rRhsHasNu
13520 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
13530 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
13540 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13550 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
13560 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
13570 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13580 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13590 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
135a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
135b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
135c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
135d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
135e0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
135f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13600 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
13610 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
13620 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13630 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
13640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13650 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
13660 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
13670 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
13680 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
13690 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
136a0 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
136b0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
136c0 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
136d0 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
136e0 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
136f0 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
13700 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
13710 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
13720 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
13730 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
13740 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
13750 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
13760 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
13770 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
13780 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
13790 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
137a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
137b0 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
137c0 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
137d0 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
137e0 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
137f0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
13800 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
13810 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
13820 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
13830 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
13840 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
13850 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
13860 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
13870 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
13880 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
13890 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
138a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
138b0 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c  4Dup8(v, OP_Real
138c0 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
138d0 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45  8*)&value, P4_RE
138e0 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
138f0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  f.../*.** Genera
13900 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
13910 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
13920 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
13930 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
13940 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
13950 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
13960 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  .** Expr.u.zToke
13970 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38  n is always UTF8
13980 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   and zero-termin
13990 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
139a0 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
139b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
139c0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
139d0 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
139e0 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  em){.  Vdbe *v =
139f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13a00 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
13a10 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
13a20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
13a30 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b  pExpr->u.iValue;
13a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d  .    assert( i>=
13a50 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  0 );.    if( neg
13a60 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
13a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13a80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
13a90 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
13aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
13ab0 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b  ;.    i64 value;
13ac0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13ad0 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
13ae0 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
13af0 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20  ( z!=0 );.    c 
13b00 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  = sqlite3DecOrHe
13b10 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65  xToI64(z, &value
13b20 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20  );.    if( c==0 
13b30 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46  || (c==2 && negF
13b40 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  lag) ){.      if
13b50 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
13b60 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c  ue = c==2 ? SMAL
13b70 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
13b80 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  lue; }.      sql
13b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
13ba0 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p8(v, OP_Int64, 
13bb0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
13bc0 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36  )&value, P4_INT6
13bd0 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  4);.    }else{.#
13be0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13bf0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
13c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
13c10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13c20 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65  oversized intege
13c30 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61  r: %s%s", negFla
13c40 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29  g ? "-" : "", z)
13c50 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
13c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f  SQLITE_OMIT_HEX_
13c70 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66  INTEGER.      if
13c80 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
13c90 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20  mp(z,"0x",2)==0 
13ca0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13cb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13cc0 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20  e, "hex literal 
13cd0 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a 29  too big: %s", z)
13ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
13cf0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
13d00 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
13d10 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   z, negFlag, iMe
13d20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  m);.      }.#end
13d30 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
13d40 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61  /*.** Clear a ca
13d50 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  che entry..*/.st
13d60 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45  atic void cacheE
13d70 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20  ntryClear(Parse 
13d80 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
13d90 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20  yColCache *p){. 
13da0 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20   if( p->tempReg 
13db0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
13dc0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
13dd0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
13de0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
13df0 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
13e00 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
13e10 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b  eg++] = p->iReg;
13e20 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65  .    }.    p->te
13e30 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  mpReg = 0;.  }.}
13e40 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  .../*.** Record 
13e50 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  in the column ca
13e60 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69  che that a parti
13e70 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f  cular column fro
13e80 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  m a.** particula
13e90 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65  r table is store
13ea0 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
13eb0 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76  r register..*/.v
13ec0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
13ed0 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20  acheStore(Parse 
13ee0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
13ef0 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74  b, int iCol, int
13f00 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
13f10 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20  .  int minLru;. 
13f20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73   int idxLru;.  s
13f30 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
13f40 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p;..  /* Unless
13f50 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
13f60 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72  curred, register
13f70 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77   numbers are alw
13f80 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f  ays positive. */
13f90 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e  .  assert( iReg>
13fa0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
13fb0 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
13fc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13fd0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
13fe0 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36  =-1 && iCol<3276
13ff0 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20  8 );  /* Finite 
14000 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  column numbers *
14010 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49  /..  /* The SQLI
14020 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66  TE_ColumnCache f
14030 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65  lag disables the
14040 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20   column cache.  
14050 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a  This is used.  *
14060 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e  * for testing on
14070 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74  ly - to verify t
14080 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79  hat SQLite alway
14090 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20  s gets the same 
140a0 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68  answer.  ** with
140b0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65   and without the
140c0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
140d0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
140e0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70  zationDisabled(p
140f0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
14100 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29  E_ColumnCache) )
14110 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46   return;..  /* F
14120 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79  irst replace any
14130 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e   existing entry.
14140 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
14150 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65  lly, the way the
14160 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73   column cache is
14170 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c   currently used,
14180 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65   we are guarante
14190 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ed.  ** that the
141a0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76   object will nev
141b0 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e  er already be in
141c0 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20   cache.  Verify 
141d0 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a  this guarantee..
141e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
141f0 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  BUG.  for(i=0, p
14200 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
14210 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
14220 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
14230 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
14240 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d  p->iReg==0 || p-
14250 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
14260 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f   p->iColumn!=iCo
14270 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
14280 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d  .  /* Find an em
14290 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70  pty slot and rep
142a0 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72  lace it */.  for
142b0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
142c0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
142d0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
142e0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
142f0 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b  f( p->iReg==0 ){
14300 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  .      p->iLevel
14310 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
14320 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d  eLevel;.      p-
14330 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
14340 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e        p->iColumn
14350 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
14360 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
14370 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
14380 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  = 0;.      p->lr
14390 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
143a0 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  heCnt++;.      r
143b0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
143c0 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
143d0 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79  he last recently
143e0 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72   used */.  minLr
143f0 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a  u = 0x7fffffff;.
14400 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20    idxLru = -1;. 
14410 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
14420 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
14430 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
14440 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
14450 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69     if( p->lru<mi
14460 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64  nLru ){.      id
14470 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
14480 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b  minLru = p->lru;
14490 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
144a0 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d   ALWAYS(idxLru>=
144b0 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  0) ){.    p = &p
144c0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
144d0 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d  [idxLru];.    p-
144e0 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
144f0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
14500 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
14510 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c  Tab;.    p->iCol
14520 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
14530 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
14540 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
14550 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d   0;.    p->lru =
14560 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
14570 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
14580 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
14590 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67  ndicate that reg
145a0 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69  isters between i
145b0 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31  Reg..iReg+nReg-1
145c0 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77   are being overw
145d0 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65  ritten..** Purge
145e0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
145f0 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65  gisters from the
14600 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
14610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
14620 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61  prCacheRemove(Pa
14630 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14640 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
14650 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
14660 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20   iLast = iReg + 
14670 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75  nReg - 1;.  stru
14680 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
14690 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
146a0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
146b0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
146c0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
146d0 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
146e0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
146f0 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73  =iReg && r<=iLas
14700 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  t ){.      cache
14710 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
14720 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
14730 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
14740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
14750 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e  ember the curren
14760 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63  t column cache c
14770 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77  ontext.  Any new
14780 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a   entries added.*
14790 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  * added to the c
147a0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65  olumn cache afte
147b0 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20  r this call are 
147c0 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65  removed when the
147d0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
147e0 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f  g pop occurs..*/
147f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14800 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65  rCachePush(Parse
14810 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
14820 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14830 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ++;.#ifdef SQLIT
14840 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
14850 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
14860 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
14870 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
14880 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25  rintf("PUSH to %
14890 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
148a0 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
148b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
148c0 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
148d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
148e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
148f0 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
14900 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
14910 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  us sqlite3ExprCa
14920 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f  chePush operatio
14930 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
14940 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74  ds, restore.** t
14950 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20  he cache to the 
14960 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
14970 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  prior the most r
14980 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76  ecent Push..*/.v
14990 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
149a0 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70  achePop(Parse *p
149b0 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
149c0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
149d0 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  che *p;.  assert
149e0 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
149f0 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50  Level>=1 );.  pP
14a00 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
14a10 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l--;.#ifdef SQLI
14a20 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
14a30 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
14a40 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
14a50 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14a60 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20  printf("POP  to 
14a70 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
14a80 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
14a90 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
14aa0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
14ab0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
14ac0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14ad0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
14ae0 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c  p->iReg && p->iL
14af0 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61  evel>pParse->iCa
14b00 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  cheLevel ){.    
14b10 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
14b20 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
14b30 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b      p->iReg = 0;
14b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14b50 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65  .** When a cache
14b60 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73  d column is reus
14b70 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ed, make sure th
14b80 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20  at its register 
14b90 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20  is.** no longer 
14ba0 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74  available as a t
14bb0 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74  emp register.  t
14bc0 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68  icket #3879:  th
14bd0 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73  at same.** regis
14be0 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20  ter might be in 
14bf0 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c  the cache in mul
14c00 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f  tiple places, so
14c10 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67   be sure to.** g
14c20 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a  et them all..*/.
14c30 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
14c40 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52  te3ExprCachePinR
14c50 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
14c60 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
14c70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
14c80 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
14c90 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
14ca0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14cb0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14cc0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14cd0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
14ce0 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
14cf0 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
14d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14d10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14d20 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69 6e  hat will load in
14d30 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67 4f  to register regO
14d40 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ut a value that 
14d50 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  is.** appropriat
14d60 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43 6f  e for the iIdxCo
14d70 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  l-th column of i
14d80 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76 6f  ndex pIdx..*/.vo
14d90 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
14da0 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d  deLoadIndexColum
14db0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
14dc0 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72 73  se,  /* The pars
14dd0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14de0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
14df0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 68   /* The index wh
14e00 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74 6f  ose column is to
14e10 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20   be loaded */.  
14e20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
14e30 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
14e40 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72 6f  ng to a table ro
14e50 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  w */.  int iIdxC
14e60 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ol,    /* The co
14e70 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
14e80 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  x to be loaded *
14e90 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
14ea0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
14eb0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76 61   index column va
14ec0 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
14ed0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31 36  ster */.){.  i16
14ee0 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78 2d   iTabCol = pIdx-
14ef0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43 6f  >aiColumn[iIdxCo
14f00 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43 6f  l];.  if( iTabCo
14f10 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  l==XN_EXPR ){.  
14f20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
14f30 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20 20  aColExpr );.    
14f40 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
14f50 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69 49  olExpr->nExpr>iI
14f60 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50 61  dxCol );.    pPa
14f70 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
14f80 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71 6c  iTabCur;.    sql
14f90 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
14fa0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
14fb0 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78 43  ColExpr->a[iIdxC
14fc0 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f 75  ol].pExpr, regOu
14fd0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
14fe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14ff0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
15000 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
15010 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69 54  pIdx->pTable, iT
15020 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  abCur,.         
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 43             iTabC
15050 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
15060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15070 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
15080 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
15090 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
150a0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
150b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
150c0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
150d0 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
150e0 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
150f0 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
15100 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
15110 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
15120 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
15130 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
15140 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
15150 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
15160 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
15170 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
15180 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
15190 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
151a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
151b0 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
151c0 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
151d0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
151e0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
151f0 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
15200 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43  r */.){.  if( iC
15210 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
15220 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
15230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15240 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
15250 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
15260 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
15270 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
15280 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
15290 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
152a0 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43  ;.    int x = iC
152b0 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73  ol;.    if( !Has
152c0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
152d0 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
152e0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71  ColumnOfIndex(sq
152f0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
15300 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c  ndex(pTab), iCol
15310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15320 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15330 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78  , op, iTabCur, x
15340 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
15350 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
15360 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
15370 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
15380 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
15390 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
153a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
153b0 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
153c0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
153d0 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
153e0 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
153f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
15400 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
15410 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72   .**.** An effor
15420 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f  t is made to sto
15430 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
15440 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
15450 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69  iReg.  This.** i
15460 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64  s not garanteeed
15470 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29   for GetColumn()
15480 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63 61   - the result ca
15490 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  n be stored in.*
154a0 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20  * any register. 
154b0 20 42 75 74 20 74 68 65 20 72 65 73 75 6c 74 20   But the result 
154c0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
154d0 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65   land in registe
154e0 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65  r iReg.** for Ge
154f0 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a  tColumnToReg()..
15500 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
15510 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
15520 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
15530 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
15540 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
15550 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
15560 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
15570 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
15580 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
15590 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
155a0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
155b0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
155c0 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
155d0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
155e0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
155f0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
15600 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
15610 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
15620 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
15630 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
15640 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
15650 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
15660 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
15670 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
15680 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
15690 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
156a0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
156b0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
156c0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
156d0 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
156e0 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
156f0 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46  or OP_Column + F
15700 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  LAGS */.){.  Vdb
15710 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
15720 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
15730 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
15740 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
15750 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
15760 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
15770 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
15780 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
15790 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69  ->iReg>0 && p->i
157a0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
157b0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
157c0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  lumn ){.      p-
157d0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
157e0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
157f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15800 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50  hePinRegister(pP
15810 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a  arse, p->iReg);.
15820 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
15830 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  iReg;.    }.  } 
15840 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30   .  assert( v!=0
15850 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
15860 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
15870 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
15880 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
15890 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20  iReg);.  if( p5 
158a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
158b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
158c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20  );.  }else{   . 
158d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
158e0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
158f0 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
15900 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72  , iReg);.  }.  r
15910 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f  eturn iReg;.}.vo
15920 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
15930 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67  deGetColumnToReg
15940 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15950 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
15960 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
15970 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15980 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
15990 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
159a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
159b0 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
159c0 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
159d0 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
159e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
159f0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
15a00 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
15a10 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
15a20 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
15a30 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
15a40 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
15a50 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
15a60 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
15a70 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
15a80 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61  lumn(pParse, pTa
15a90 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62  b, iColumn, iTab
15aa0 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20  le, iReg, 0);.  
15ab0 69 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73  if( r1!=iReg ) s
15ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15ad0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
15ae0 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52  OP_SCopy, r1, iR
15af0 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  eg);.}.../*.** C
15b00 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  lear all column 
15b10 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a  cache entries..*
15b20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
15b30 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72  prCacheClear(Par
15b40 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
15b50 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
15b60 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69  ColCache *p;..#i
15b70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
15b80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
15b90 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15ba0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
15bb0 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c  {.    printf("CL
15bc0 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  EAR\n");.  }.#en
15bd0 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  dif.  for(i=0, p
15be0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
15bf0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
15c00 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
15c10 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
15c20 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63  Reg ){.      cac
15c30 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
15c40 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
15c50 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
15c60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
15c70 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
15c80 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
15c90 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
15ca0 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
15cb0 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
15cc0 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
15cd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15ce0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
15cf0 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
15d00 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
15d10 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
15d20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15d30 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
15d40 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29   iStart, iCount)
15d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
15d60 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65  ate code to move
15d70 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
15d80 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
15d90 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
15da0 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
15db0 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68  +nReg-1. Keep th
15dc0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
15dd0 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
15de0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
15df0 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
15e00 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
15e10 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52   int iTo, int nR
15e20 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  eg){.  assert( i
15e30 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c  From>=iTo+nReg |
15e40 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54  | iFrom+nReg<=iT
15e50 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  o );.  sqlite3Vd
15e60 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
15e70 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
15e80 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
15e90 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
15ea0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
15eb0 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67  rse, iFrom, nReg
15ec0 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  );.}..#if define
15ed0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
15ee0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15ef0 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
15f00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
15f10 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74  ue if any regist
15f20 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  er in the range 
15f30 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c  iFrom..iTo (incl
15f40 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65  usive).** is use
15f50 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
15f60 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a   column cache..*
15f70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15f80 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  e is used within
15f90 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
15fa0 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20  stcase() macros 
15fb0 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  only.** and does
15fc0 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61   not appear in a
15fd0 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a   normal build..*
15fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65  /.static int use
15ff0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  dAsColumnCache(P
16000 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
16010 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
16020 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
16030 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
16040 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
16050 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
16060 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
16070 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
16080 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
16090 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
160a0 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69  r>=iFrom && r<=i
160b0 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20  To ) return 1;  
160c0 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
160d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
160e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
160f0 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45  _DEBUG || SQLITE
16100 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a  _COVERAGE_TEST *
16110 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
16120 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
16130 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49  ode to a TK_REGI
16140 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76  STER.*/.static v
16150 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74  oid exprToRegist
16160 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
16170 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20  iReg){.  p->op2 
16180 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70  = p->op;.  p->op
16190 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
161a0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52    p->iTable = iR
161b0 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50  eg;.  ExprClearP
161c0 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b  roperty(p, EP_Sk
161d0 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ip);.}../*.** Ge
161e0 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
161f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
16200 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
16210 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
16220 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20  ssion.  Attempt 
16230 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
16240 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
16250 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65   "target"..** Re
16260 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
16270 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20  r where results 
16280 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
16290 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74  * With this rout
162a0 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ine, there is no
162b0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
162c0 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
162d0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
162e0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
162f0 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
16300 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
16310 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
16320 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
16330 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
16340 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
16350 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
16360 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
16370 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
16380 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
16390 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
163a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
163b0 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
163c0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
163d0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
163e0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
163f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
16400 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
16410 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
16420 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
16430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16440 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
16450 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
16460 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
16470 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
16480 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
16490 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
164a0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
164b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
164c0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
164d0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
164e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
164f0 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
16500 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
16510 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
16520 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
16530 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20  /.  int r1, r2, 
16540 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a  r3, r4;       /*
16550 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
16560 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73  r numbers */.  s
16570 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
16580 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
16590 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
165a0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65  ion */.  Expr te
165b0 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  mpX;            
165c0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
165d0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
165e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  */..  assert( ta
165f0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
16600 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
16610 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
16620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
16630 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16640 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
16650 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rn 0;.  }..  if(
16660 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
16670 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
16680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
16690 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
166a0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
166b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
166c0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
166d0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
166e0 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
166f0 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
16700 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
16710 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
16720 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
16730 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
16740 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
16750 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
16760 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
16770 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
16780 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
16790 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
167a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
167b0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
167c0 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
167d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
167e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
167f0 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
16800 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20  ortingIdxPTab,. 
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
16830 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
16840 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16850 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16860 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
16870 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
16880 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
16890 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
168a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
168b0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
168c0 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
168d0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
168e0 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20   iTab<0 ){.     
168f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
16900 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  kBase>0 ){.     
16910 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69       /* Generati
16920 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ng CHECK constra
16930 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e  ints or insertin
16940 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69  g into partial i
16950 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
16960 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
16970 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
16980 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
16990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
169a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
169b0 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61       /* Coding a
169c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
169d0 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
169e0 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75  index where colu
169f0 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20  mn names.       
16a00 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64     ** in the ind
16a10 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ex refer to the 
16a20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74  table to which t
16a30 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73  he index belongs
16a40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
16a50 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  ab = pParse->iSe
16a60 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  lfTab;.        }
16a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16a80 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
16a90 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
16aa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16ab0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
16ae0 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
16af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
16b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
16b40 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
16b50 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
16b60 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
16b70 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
16b80 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
16b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
16ba0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
16bb0 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
16bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
16bd0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16be0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
16bf0 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
16c00 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
16c10 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
16c20 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
16c30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16c40 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
16c50 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
16c60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
16c70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
16c80 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
16c90 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
16ca0 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74  String(v, target
16cb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
16cc0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
16cd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16ce0 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
16cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d00 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
16d10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
16d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16d40 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
16d50 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
16d60 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
16d70 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
16d80 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
16d90 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
16da0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
16db0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16dc0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
16de0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
16df0 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
16e00 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
16e10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16e20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
16e30 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
16e40 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
16e50 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
16e60 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
16e70 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
16e80 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
16e90 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
16ea0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
16eb0 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
16ec0 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
16ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16ee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
16ef0 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
16f00 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
16f10 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62  YNAMIC);.      b
16f20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16f30 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
16f40 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
16f50 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16f60 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16f70 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16f90 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
16fa0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
16fb0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16fc0 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
16fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16fe0 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
16ff0 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
17000 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
17010 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
17020 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
17030 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17040 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
17050 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20  0]=='?' .       
17060 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
17070 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
17080 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
17090 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
170a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
170b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
170c0 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73  eP4(v, -1, pPars
170d0 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
170e0 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53  iColumn-1], P4_S
170f0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
17100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17110 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
17120 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
17130 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
17140 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
17150 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
17160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
17170 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
17180 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
17190 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
171a0 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
171b0 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
171c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
171d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
171e0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
171f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
17200 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
17210 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
17220 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17240 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
17250 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
17260 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
17270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17290 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
172a0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
172c0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
172d0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
172e0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73  , 0));.      tes
172f0 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
17300 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
17310 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
17320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
17330 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
17340 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
17350 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
17360 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
17370 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
17380 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
17390 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
173a0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
173b0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
173c0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
173d0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
173e0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
173f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
17400 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17410 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17420 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17430 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17440 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17450 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17460 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
17470 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
17480 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
17490 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
174a0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
174c0 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
174d0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
174e0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
174f0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
17500 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
17510 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
17520 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
17530 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
17540 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
17550 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
17560 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
17570 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
17580 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
17590 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
175a0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
175b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
175c0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
175d0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
175e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
175f0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
17600 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
17610 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
17620 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
17630 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
17640 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
17650 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
17660 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17670 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
17680 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
17690 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
176a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
176b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
176c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
176d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
176e0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
176f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17700 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
17710 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
17720 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
17730 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
17740 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17750 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
17760 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
17770 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17780 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17790 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
177a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
177b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
177c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
177d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
177e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
177f0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
17800 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
17810 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
17820 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17830 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
17840 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
17850 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
17860 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
17870 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49  E_STOREP2 | SQLI
17880 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
17890 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
178a0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
178b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
178c0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
178d0 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
178e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
178f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17900 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
17910 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17920 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17930 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
17940 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
17950 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
17960 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
17970 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
17980 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
17990 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
179a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
179b0 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
179c0 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
179d0 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
179e0 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
179f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
17a00 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
17a10 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
17a20 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
17a30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17a40 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
17a50 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
17a60 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
17a70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17a80 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
17a90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
17aa0 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
17ab0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17ac0 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
17ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17ae0 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
17af0 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
17b00 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
17b10 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
17b20 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
17b30 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
17b40 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17b50 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
17b60 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
17b70 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
17b80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17b90 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
17ba0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
17bb0 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
17bc0 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
17bd0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
17be0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17bf0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
17c00 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
17c10 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
17c20 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
17c30 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
17c40 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
17c50 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17c60 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
17c70 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
17c80 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
17c90 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
17ca0 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
17cb0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17cc0 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
17cd0 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
17ce0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17cf0 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
17d00 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17d10 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17d20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
17d30 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17d40 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17d50 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17d60 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17d70 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17d90 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
17da0 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
17db0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17dc0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17dd0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17de0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17e00 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
17e10 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
17e20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
17e30 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
17e40 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
17e50 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
17e60 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
17e70 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
17e80 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
17e90 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
17ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17eb0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
17ec0 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
17ed0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
17ee0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
17ef0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17f00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17f10 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
17f20 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
17f30 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
17f40 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
17f50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
17f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
17f70 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
17f80 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
17f90 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
17fa0 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
17fb0 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
17fc0 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
17fd0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
17fe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17ff0 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
18000 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18010 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
18020 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
18030 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
18040 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
18050 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18060 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18070 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
18080 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
18090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
180a0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
180b0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
180c0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
180d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
180e0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
180f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
18100 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
18110 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
18120 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
18130 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
18140 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
18150 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
18160 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
18170 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18180 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
18190 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
181a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
181b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
181c0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
181d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
181e0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
181f0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
18200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18210 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
18220 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
18230 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18240 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
18250 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
18260 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
18270 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
18280 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
18290 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
182a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
182b0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
182c0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
182d0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
182e0 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
182f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
18300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
18320 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
18330 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
18340 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18350 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18360 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
18370 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18380 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
18390 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
183a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
183b0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
183c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
183d0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
183e0 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
183f0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
18400 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
18410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18420 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18430 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
18440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18450 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
18460 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
18470 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18480 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
18490 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
184a0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
184b0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
184c0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
184d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
184e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
184f0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
18500 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
18510 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18520 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
18530 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
18540 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
18550 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
18560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
18570 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
18580 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
18590 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
185a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
185b0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
185c0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
185d0 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
185e0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
185f0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
18600 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
18610 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
18620 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18630 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
18640 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
18650 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
18660 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
18670 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
18680 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
18690 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
186a0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
186b0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
186c0 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
186d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
186e0 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
186f0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
18700 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
18710 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
18720 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
18730 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
18740 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
18750 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
18760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18770 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18780 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
18790 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
187a0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
187b0 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
187c0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
187d0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
187e0 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
187f0 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
18800 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
18810 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18820 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18830 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18840 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
18850 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18860 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
18870 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
18880 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
18890 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
188a0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
188b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
188c0 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
188d0 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
188e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
188f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18900 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
18910 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
18920 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
18930 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
18940 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18950 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
18960 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
18970 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
18980 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
18990 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
189a0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
189b0 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b  >xFinalize!=0 ){
189c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
189e0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
189f0 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  on: %.*s()", nId
18a00 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
18a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
18a20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
18a30 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
18a40 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18a50 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
18a60 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
18a70 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
18a80 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
18a90 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
18aa0 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
18ab0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
18ac0 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
18ad0 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
18ae0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18af0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
18b00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
18b10 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
18b20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
18b30 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
18b40 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18b60 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
18b70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18b80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
18b90 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
18ba0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
18bb0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
18bc0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
18bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18be0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
18bf0 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
18c00 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
18c10 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18c20 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
18c30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
18c40 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
18c50 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
18c60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18c70 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18c80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18c90 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18ca0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
18cb0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18cc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18cd0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18ce0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
18cf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18d00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18d10 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
18d20 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18d30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18d40 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
18d50 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
18d60 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
18d70 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
18d80 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
18d90 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
18da0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18db0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
18dc0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
18dd0 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
18de0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
18df0 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
18e00 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
18e10 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18e20 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18e30 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
18e40 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18e50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18e60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
18e70 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
18e80 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
18e90 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
18ea0 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
18eb0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
18ec0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
18ed0 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
18ee0 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
18ef0 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
18f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18f10 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
18f20 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
18f30 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
18f40 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
18f50 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
18f60 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
18f70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18f80 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
18f90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18fa0 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
18fb0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
18fc0 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
18fd0 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
18fe0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
18ff0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19000 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
19010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19020 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
19030 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
19040 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
19050 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
19060 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
19070 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
19080 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
19090 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
190a0 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
190b0 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
190c0 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
190d0 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
190e0 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
190f0 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
19100 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
19110 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
19120 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
19130 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
19140 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
19150 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
19160 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
19170 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
19180 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
19190 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
191a0 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
191b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
191c0 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
191d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
191e0 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
191f0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
19200 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
19210 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
19220 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
19230 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
19240 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
19250 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
19260 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
19270 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
19280 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
19290 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
192a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
192b0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
192c0 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
192d0 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
192e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
192f0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
19300 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
19310 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
19320 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
19330 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
19340 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
19350 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
19360 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
19370 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
19380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19390 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
193a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
193b0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
193c0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
193d0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
193e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
193f0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
19400 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
19410 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
19440 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
19450 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
19460 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19470 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
19480 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
19490 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
194a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
194b0 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
194c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
194d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
194e0 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
194f0 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
19500 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
19510 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19520 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
19530 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
19540 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
19550 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
19560 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
19570 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
19580 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
19590 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
195a0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
195b0 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
195c0 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
195d0 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
195e0 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
195f0 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
19600 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
19610 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
19620 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
19630 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
19640 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
19650 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
19660 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
19670 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
19680 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
19690 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
196a0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
196b0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
196c0 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
196d0 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
196e0 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
196f0 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
19700 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
19710 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
19720 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
19730 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
19740 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
19750 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
19760 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
19770 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
19780 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
19790 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
197a0 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
197b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
197c0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
197d0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
197e0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
197f0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
19800 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
19810 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
19820 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
19830 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
19840 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
19850 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
19860 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
19870 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
19880 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
19890 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
198a0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
198b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
198c0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
198d0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
198e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
198f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
19900 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
19910 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
19920 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
19930 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19940 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19950 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f  OP_Function0, co
19960 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
19970 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19990 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
199a0 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
199b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
199c0 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
199d0 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
199e0 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
199f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19a00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
19a10 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
19a20 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
19a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19a40 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19a50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19a60 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
19a70 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
19a80 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
19a90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
19aa0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
19ab0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19ac0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
19ad0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19ae0 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
19af0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
19b00 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
19b10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19b20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
19b30 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
19b40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19b50 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19b60 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
19b70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19b80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19ba0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
19bb0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19bc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19bd0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
19be0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
19bf0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
19c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19c10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19c20 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
19c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19c40 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19c50 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
19c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19c70 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
19c80 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
19c90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19ca0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19cb0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
19cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19cd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19ce0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
19cf0 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
19d00 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
19d10 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
19d20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
19d30 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
19d40 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
19d50 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
19d60 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
19d70 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
19d80 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
19d90 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
19da0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
19db0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
19dc0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
19dd0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
19de0 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
19df0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
19e00 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
19e10 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
19e20 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
19e30 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
19e40 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
19e50 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
19e60 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
19e70 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
19e80 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ..      r1 = sql
19e90 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19ea0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
19eb0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
19ec0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
19ed0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19ee0 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
19ef0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
19f00 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
19f10 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
19f20 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
19f30 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
19f40 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19f50 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19f60 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
19f70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19f80 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
19f90 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
19fa0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
19fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19fc0 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
19fd0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20  QLITE_STOREP2); 
19fe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19ff0 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
1a000 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
1a010 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
1a020 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a030 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a040 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
1a050 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1a060 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a070 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
1a080 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1a090 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1a0a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  e2==0 );.      c
1a0b0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1a0c0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1a0d0 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c  , OP_Le, r1, r2,
1a0e0 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r4, SQLITE_STOR
1a0f0 45 50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  EP2);.      Vdbe
1a100 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a120 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  dOp3(v, OP_And, 
1a130 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b  r3, r4, target);
1a140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a150 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a160 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  rse, r3);.      
1a170 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a180 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34  mpReg(pParse, r4
1a190 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a1a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a1b0 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20  K_COLLATE: .    
1a1c0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
1a1d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1a1e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1a1f0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1a200 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1a210 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1a220 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
1a230 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20   TK_TRIGGER: {. 
1a240 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
1a250 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47  pcode is TK_TRIG
1a260 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78  GER, then the ex
1a270 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65  pression is a re
1a280 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a  ference.      **
1a290 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   to a column in 
1a2a0 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  the new.* or old
1a2b0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73  .* pseudo-tables
1a2c0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20   available to.  
1a2d0 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70      ** trigger p
1a2e0 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73  rograms. In this
1a2f0 20 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c   case Expr.iTabl
1a300 65 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f  e is set to 1 fo
1a310 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  r the.      ** n
1a320 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
1a330 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20  e, or 0 for the 
1a340 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1a350 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  le. Expr.iColumn
1a360 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
1a370 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f   to the column o
1a380 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62  f the pseudo-tab
1a390 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74  le to read, or t
1a3a0 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a  o -1 to.      **
1a3b0 20 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   read the rowid 
1a3c0 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  field..      **.
1a3d0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70        ** The exp
1a3e0 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65  ression is imple
1a3f0 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20  mented using an 
1a400 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e  OP_Param opcode.
1a410 20 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a   The p1.      **
1a420 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65   parameter is se
1a430 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c  t to 0 for an ol
1a440 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  d.rowid referenc
1a450 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20  e, or to (i+1). 
1a460 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72       ** to refer
1a470 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c  ence another col
1a480 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a  umn of the old.*
1a490 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77   pseudo-table, w
1a4a0 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  here .      ** i
1a4b0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
1a4c0 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72   the column. For
1a4d0 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66   a new.rowid ref
1a4e0 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20  erence, p1 is.  
1a4f0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e      ** set to (n
1a500 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20  +1), where n is 
1a510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1a520 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73  lumns in each ps
1a530 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20  eudo-table..    
1a540 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72    ** For a refer
1a550 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65  ence to any othe
1a560 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
1a570 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
1a580 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  le, p1.      ** 
1a590 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69  is set to (n+2+i
1a5a0 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69  ), where n and i
1a5b0 20 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20   are as defined 
1a5c0 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a  previously. For.
1a5d0 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
1a5e0 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  , if the table o
1a5f0 6e 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73  n which triggers
1a600 20 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64   are being fired
1a610 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63   is.      ** dec
1a620 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20  lared as:.      
1a630 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52  **.      **   CR
1a640 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1a650 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20   b);.      **.  
1a660 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69      ** Then p1 i
1a670 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1a680 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
1a690 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  **.      **   p1
1a6a0 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==0   ->    old.
1a6b0 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20  rowid     p1==3 
1a6c0 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69    ->    new.rowi
1a6d0 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  d.      **   p1=
1a6e0 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61  =1   ->    old.a
1a6f0 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20           p1==4  
1a700 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20   ->    new.a.   
1a710 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20     **   p1==2   
1a720 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20  ->    old.b     
1a730 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20      p1==5   ->  
1a740 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20    new.b       . 
1a750 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
1a760 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
1a770 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  r->pTab;.      i
1a780 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69  nt p1 = pExpr->i
1a790 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e  Table * (pTab->n
1a7a0 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78  Col+1) + 1 + pEx
1a7b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20  pr->iColumn;..  
1a7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a7d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  r->iTable==0 || 
1a7e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31  pExpr->iTable==1
1a7f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a800 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
1a810 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69  >=-1 && pExpr->i
1a820 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f  Column<pTab->nCo
1a830 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
1a840 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  t( pTab->iPKey<0
1a850 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   || pExpr->iColu
1a860 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  mn!=pTab->iPKey 
1a870 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a880 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54   p1>=0 && p1<(pT
1a890 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b  ab->nCol*2+2) );
1a8a0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
1a8b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a8c0 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65  Param, p1, targe
1a8d0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1a8e0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
1a8f0 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20   -> $%d",.      
1a900 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65    (pExpr->iTable
1a910 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22   ? "new" : "old"
1a920 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70  ),.        (pExp
1a930 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22  r->iColumn<0 ? "
1a940 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e  rowid" : pExpr->
1a950 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
1a960 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65  ->iColumn].zName
1a970 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65  ),.        targe
1a980 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66  t.      ));..#if
1a990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a9a0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1a9b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1a9c0 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20  column has REAL 
1a9d0 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79  affinity, it may
1a9e0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
1a9f0 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  ored as an.     
1aa00 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65   ** integer. Use
1aa10 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
1aa20 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
1aa30 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e   is really real.
1aa40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1aa50 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1aa60 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51  R-60985-57662 SQ
1aa70 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72  Lite will conver
1aa80 74 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b  t the value back
1aa90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f   to.      ** flo
1aaa0 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e  ating point when
1aab0 20 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66   extracting it f
1aac0 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20  rom the record. 
1aad0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
1aae0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
1aaf0 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
1ab00 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
1ab10 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
1ab20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
1ab30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1ab40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab50 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
1ab60 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
1ab70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1ab80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ab90 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
1aba0 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
1abb0 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
1abc0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
1abd0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
1abe0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
1abf0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
1ac00 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
1ac10 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
1ac20 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
1ac30 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
1ac40 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
1ac50 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1ac60 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
1ac70 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
1ac80 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
1ac90 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
1aca0 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
1acb0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
1acc0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
1acd0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
1ace0 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
1acf0 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
1ad00 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1ad10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
1ad20 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
1ad30 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
1ad40 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
1ad50 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
1ad60 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
1ad70 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
1ad80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
1ad90 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
1ada0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
1adb0 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
1adc0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1add0 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
1ade0 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
1adf0 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
1ae00 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
1ae10 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
1ae20 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
1ae30 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1ae40 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
1ae50 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1ae60 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
1ae70 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
1ae80 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1ae90 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
1aea0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
1aeb0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
1aec0 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
1aed0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
1aee0 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
1aef0 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
1af00 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
1af10 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
1af20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
1af30 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
1af40 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
1af50 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af70 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
1af80 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
1af90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
1afa0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
1afc0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
1afd0 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
1afe0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
1aff0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1b000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
1b010 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
1b020 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
1b030 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1b060 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
1b070 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1b080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1b090 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
1b0a0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
1b0b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1b0c0 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
1b0d0 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
1b0e0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
1b0f0 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b110 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
1b120 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
1b130 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b150 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
1b160 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
1b170 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
1b1a0 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
1b1b0 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
1b1c0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
1b1d0 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
1b1e0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
1b1f0 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
1b200 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1b210 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1b220 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
1b230 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
1b240 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
1b250 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
1b260 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
1b270 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1b280 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
1b290 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
1b2a0 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
1b2b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
1b2c0 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
1b2d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b2e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
1b2f0 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
1b300 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
1b310 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
1b320 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b330 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
1b340 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
1b350 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
1b360 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78  tempX, sqlite3Ex
1b370 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b380 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
1b390 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
1b3a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1b3b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  0 );.        opC
1b3c0 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
1b3d0 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
1b3e0 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
1b3f0 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
1b400 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
1b410 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
1b420 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
1b430 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
1b440 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
1b450 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
1b460 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
1b470 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
1b480 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
1b490 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
1b4a0 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
1b4b0 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
1b4c0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
1b4d0 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
1b4e0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
1b4f0 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
1b500 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
1b510 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
1b520 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
1b530 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1b540 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
1b550 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
1b560 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1b570 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1b580 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
1b590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1b5a0 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
1b5b0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
1b5c0 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
1b5d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1b5e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b5f0 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
1b600 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
1b610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b620 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
1b630 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b640 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
1b650 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
1b660 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1b670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b680 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1b690 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
1b6a0 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
1b6b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
1b6c0 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
1b6d0 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
1b6e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
1b6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b700 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b710 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
1b720 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1b730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b740 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61  dbeGoto(v, endLa
1b750 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
1b760 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1b770 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1b780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b790 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
1b7a0 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
1b7b0 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
1b7c0 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
1b7d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b7e0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1b7f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b800 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b810 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
1b820 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
1b830 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1b840 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1b850 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
1b860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1b870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b880 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1b890 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1b8a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1b8b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1b8c0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
1b8d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
1b8e0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1b8f0 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
1b900 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1b910 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b920 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
1b930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b940 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1b950 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1b960 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
1b970 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1b980 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1b990 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
1b9a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1b9b0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b9c0 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
1b9d0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
1b9e0 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
1b9f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
1ba00 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1ba10 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
1ba20 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
1ba30 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
1ba40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ba50 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ba60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1ba70 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
1ba80 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
1ba90 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
1baa0 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
1bab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1bac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bad0 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
1bae0 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
1baf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bb00 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
1bb10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bb20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1bb30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1bb40 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1bb50 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1bb60 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
1bb70 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
1bb80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bb90 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
1bba0 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
1bbb0 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
1bbc0 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
1bbd0 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
1bbe0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1bbf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bc00 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
1bc10 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
1bc20 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
1bc30 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1bc60 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
1bc70 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1bc80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
1bc90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bca0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
1bcb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1bcc0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1bcd0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1bce0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1bcf0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1bd00 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
1bd10 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
1bd20 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
1bd30 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1bd40 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
1bd50 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
1bd60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1bd70 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20  xprCodeAtInit(. 
1bd80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1bd90 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1bda0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1bdb0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
1bdc0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1bdd0 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20  o code when the 
1bde0 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73  VDBE initializes
1bdf0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73   */.  int regDes
1be00 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  t,      /* Store
1be10 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1be20 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
1be30 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20   u8 reusable    
1be40 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1be50 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
1be60 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a   reusable */.){.
1be70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
1be80 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
1be90 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1bea0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
1beb0 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45  pConstExpr;.  pE
1bec0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1bed0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1bee0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
1bef0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1bf00 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1bf10 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
1bf20 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
1bf30 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1bf40 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1bf50 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
1bf60 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
1bf70 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
1bf80 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  t;.     pItem->r
1bf90 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62  eusable = reusab
1bfa0 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  le;.  }.  pParse
1bfb0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
1bfc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1bfd0 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1bfe0 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1bff0 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
1c000 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
1c010 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
1c020 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1c030 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
1c040 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
1c050 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1c060 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
1c070 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
1c080 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
1c090 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
1c0a0 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
1c0b0 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
1c0c0 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
1c0d0 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1c0e0 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
1c0f0 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
1c100 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
1c110 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
1c120 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
1c130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
1c140 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
1c150 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
1c160 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
1c170 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1c180 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
1c190 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
1c1a0 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
1c1b0 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
1c1c0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
1c1d0 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
1c1e0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c1f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c200 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1c210 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
1c220 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
1c230 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1c240 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
1c250 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
1c260 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
1c270 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
1c280 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
1c290 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1c2a0 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
1c2b0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
1c2c0 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43   *p = pParse->pC
1c2d0 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e  onstExpr;.    in
1c2e0 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20  t i;.    *pReg  
1c2f0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29  = 0;.    if( p )
1c300 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
1c310 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1c320 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  tem;.      for(p
1c330 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e  Item=p->a, i=p->
1c340 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65  nExpr; i>0; pIte
1c350 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20  m++, i--){.     
1c360 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
1c370 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
1c380 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
1c390 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c  em->pExpr,pExpr,
1c3a0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
1c3b0 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
1c3c0 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
1c3d0 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
1c3e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1c3f0 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  2 = ++pParse->nM
1c400 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  em;.    sqlite3E
1c410 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1c420 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c  arse, pExpr, r2,
1c430 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1c440 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
1c450 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1c460 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
1c470 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1c480 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1c490 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
1c4a0 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
1c4b0 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
1c4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1c4d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1c4e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1c4f0 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
1c500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c510 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
1c520 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c530 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
1c540 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
1c550 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
1c560 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
1c570 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1c580 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
1c590 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1c5a0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
1c5b0 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
1c5c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c5d0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
1c5e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1c5f0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1c600 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
1c610 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1c620 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
1c630 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
1c640 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
1c650 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
1c660 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1c670 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1c680 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
1c690 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1c6a0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
1c6b0 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
1c6c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1c6d0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1c6e0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1c6f0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c700 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61  >pVdbe!=0 || pPa
1c710 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1c720 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
1c730 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26   inReg!=target &
1c740 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  & pParse->pVdbe 
1c750 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c760 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1c770 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f  e->pVdbe, OP_SCo
1c780 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
1c790 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
1c7a0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72  ./*.** Make a tr
1c7b0 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20  ansient copy of 
1c7c0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1c7d0 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69   and then code i
1c7e0 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  t using.** sqlit
1c7f0 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54  e3ExprCode().  T
1c800 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
1c810 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
1c820 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a  te3ExprCode().**
1c830 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
1c840 20 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f   input expressio
1c850 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
1c860 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
1c870 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c880 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
1c890 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c8a0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1c8b0 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  get){.  sqlite3 
1c8c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c8d0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
1c8e0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1c8f0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
1c900 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1c910 64 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43  d ) sqlite3ExprC
1c920 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
1c930 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71  r, target);.  sq
1c940 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1c950 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  db, pExpr);.}../
1c960 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c970 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1c980 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
1c990 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
1c9a0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1c9b0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1c9c0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
1c9d0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1c9e0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
1c9f0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1ca00 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
1ca10 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
1ca20 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1ca30 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
1ca40 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
1ca50 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
1ca60 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1ca70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ca80 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
1ca90 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1caa0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1cab0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
1cac0 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
1cad0 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
1cae0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1caf0 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1cb00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1cb10 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1cb20 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  xpr, target, 0);
1cb30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1cb40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1cb50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1cb60 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
1cb70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1cb80 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
1cb90 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1cba0 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
1cbb0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
1cbc0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
1cbd0 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
1cbe0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
1cbf0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
1cc00 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
1cc10 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
1cc20 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
1cc30 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
1cc40 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
1cc50 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
1cc60 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
1cc70 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
1cc80 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
1cc90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cca0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1ccb0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1ccc0 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
1ccd0 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
1cce0 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
1ccf0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
1cd00 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
1cd10 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
1cd20 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
1cd30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cd40 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
1cd50 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1cd60 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1cd70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cd80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1cd90 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
1cda0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
1cdb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1cdc0 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
1cdd0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1cde0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1cdf0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1ce00 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1ce10 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
1ce20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ce30 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
1ce40 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
1ce50 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
1ce60 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  em);.}../*.** Ge
1ce70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1ce80 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
1ce90 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
1cea0 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
1ceb0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1cec0 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
1ced0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
1cee0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
1cef0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
1cf00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1cf10 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
1cf20 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ed..**.** The SQ
1cf30 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c  LITE_ECEL_DUP fl
1cf40 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  ag prevents the 
1cf50 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62  arguments from b
1cf60 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75  eing.** filled u
1cf70 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20  sing OP_SCopy.  
1cf80 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20  OP_Copy must be 
1cf90 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1cfa0 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
1cfb0 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d  CEL_FACTOR argum
1cfc0 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74  ent allows const
1cfd0 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ant arguments to
1cfe0 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20   be.** factored 
1cff0 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c  out into initial
1d000 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a  ization code..**
1d010 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
1d020 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61  CEL_REF flag mea
1d030 6e 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69  ns that expressi
1d040 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ons in the list 
1d050 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74  with.** ExprList
1d060 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  .a[].u.x.iOrderB
1d070 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65  yCol>0 have alre
1d080 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74  ady been evaluat
1d090 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
1d0a0 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74   in registers at
1d0b0 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20   srcReg, and so 
1d0c0 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65  the value can be
1d0d0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1d0e0 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
1d0f0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1d100 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
1d110 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
1d120 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d130 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1d140 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
1d150 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
1d160 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
1d170 74 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f  target,        /
1d180 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
1d190 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
1d1a0 74 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20  t srcReg,       
1d1b0 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73   /* Source regis
1d1c0 74 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45  ters if SQLITE_E
1d1d0 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20  CEL_REF */.  u8 
1d1e0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1d1f0 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a  /* SQLITE_ECEL_*
1d200 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73   flags */.){.  s
1d210 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1d220 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1d230 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20  t i, j, n;.  u8 
1d240 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
1d250 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
1d260 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
1d270 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20  P_SCopy;.  Vdbe 
1d280 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1d290 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  be;.  assert( pL
1d2a0 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
1d2b0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
1d2c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1d2d0 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f  ->pVdbe!=0 );  /
1d2e0 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69  * Never gets thi
1d2f0 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20  s far otherwise 
1d300 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  */.  n = pList->
1d310 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f  nExpr;.  if( !Co
1d320 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1d330 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e  se) ) flags &= ~
1d340 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1d350 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  OR;.  for(pItem=
1d360 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1d370 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
1d380 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1d390 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
1d3a0 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  r;.    if( (flag
1d3b0 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1d3c0 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20  REF)!=0 && (j = 
1d3d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  pList->a[i].u.x.
1d3e0 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
1d3f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1d400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
1d410 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c  yOp, j+srcReg-1,
1d420 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
1d430 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1d440 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
1d450 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
1d460 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1d470 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
1d480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d490 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1d4a0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1d4b0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1d4c0 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
1d4d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1d4e0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1d4f0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1d500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1d510 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
1d520 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
1d530 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pOp;.        if(
1d540 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
1d550 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
1d560 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
1d570 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
1d580 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
1d590 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
1d5a0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
1d5b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
1d5c0 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
1d5d0 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
1d5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
1d5f0 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
1d600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d620 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
1d630 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
1d640 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d650 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1d660 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
1d670 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d680 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
1d690 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
1d6a0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
1d6b0 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
1d6c0 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
1d6d0 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
1d6e0 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
1d6f0 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
1d700 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
1d710 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
1d720 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
1d730 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20   elimination of 
1d740 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1d750 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65  d exprCodeBetwee
1d760 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1d770 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1d780 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
1d790 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
1d7a0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
1d7b0 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57       /* The BETW
1d7c0 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  EEN expression *
1d7d0 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
1d7e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1d7f0 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69  re if the jump i
1d800 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  s taken */.  int
1d810 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f   jumpIfTrue,   /
1d820 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
1d830 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
1d840 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
1d850 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
1d860 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
1d870 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
1d880 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78   NULL */.){.  Ex
1d890 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
1d8a0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
1d8b0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
1d8c0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
1d8d0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
1d8e0 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
1d8f0 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
1d900 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
1d910 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
1d920 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
1d930 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
1d940 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1d950 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1d960 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
1d970 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
1d980 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1d990 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d9a0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d9b0 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
1d9c0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
1d9d0 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
1d9e0 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
1d9f0 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
1da00 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
1da10 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
1da20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
1da30 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
1da40 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
1da50 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
1da60 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1da70 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1da80 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
1da90 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
1daa0 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
1dab0 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
1dac0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
1dad0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
1dae0 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65  Expr;.  exprToRe
1daf0 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 73  gister(&exprX, s
1db00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1db10 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
1db20 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
1db30 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65    if( jumpIfTrue
1db40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1db50 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1db60 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
1db70 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1db80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1db90 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1dba0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
1dbb0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1dbc0 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
1dbd0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1dbe0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1dbf0 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  );..  /* Ensure 
1dc00 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f  adequate test co
1dc10 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74  verage */.  test
1dc20 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1dc30 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1dc40 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1dc50 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1dc60 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1dc70 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1dc80 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1dc90 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1dca0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1dcb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1dcc0 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1dcd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1dce0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1dcf0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1dd00 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1dd10 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1dd20 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1dd30 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1dd40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1dd50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1dd60 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1dd70 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1dd80 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1dd90 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1dda0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1ddb0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1ddc0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1ddd0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1dde0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1ddf0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1de00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1de10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1de20 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1de30 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1de40 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1de50 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1de60 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1de70 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
1de80 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
1de90 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
1dea0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
1deb0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
1dec0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1ded0 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1dee0 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1def0 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1df00 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
1df10 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1df20 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
1df30 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
1df40 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
1df50 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
1df60 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
1df70 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
1df80 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
1df90 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
1dfa0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
1dfb0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
1dfc0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
1dfd0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1dfe0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
1dff0 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
1e000 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
1e010 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
1e020 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
1e030 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
1e040 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
1e050 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
1e060 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
1e070 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
1e080 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
1e090 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
1e0a0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
1e0b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
1e0c0 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
1e0d0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1e0e0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1e0f0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1e100 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e110 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1e120 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1e130 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1e140 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1e150 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1e160 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1e170 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1e180 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1e190 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1e1a0 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72  ER(v==0) )     r
1e1b0 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74  eturn;  /* Exist
1e1c0 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65  ence of VDBE che
1e1d0 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a  cked by caller *
1e1e0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  /.  if( NEVER(pE
1e1f0 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  xpr==0) ) return
1e200 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69  ;  /* No way thi
1e210 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a  s can happen */.
1e220 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
1e230 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1e240 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
1e250 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
1e260 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1e270 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1e280 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1e290 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1e2a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e2b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1e2c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
1e2d0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1e2e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1e2f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e300 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1e310 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e320 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1e330 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1e340 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e350 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1e360 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e370 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
1e380 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e390 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1e3a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e3b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1e3c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e3d0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1e3e0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e3f0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1e400 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e410 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e420 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1e430 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1e440 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1e450 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1e460 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e470 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1e480 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e490 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e4a0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1e4b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e4c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1e4d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e4e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1e4f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1e500 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1e510 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e520 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1e530 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1e540 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e550 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1e560 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1e570 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1e580 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1e590 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1e5a0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1e5b0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e5c0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e5d0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1e5e0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e5f0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e600 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1e610 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1e620 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e630 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e640 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1e650 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1e660 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e670 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1e680 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1e6a0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1e6b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
1e6c0 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1e6d0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1e6e0 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1e6f0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e700 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
1e710 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1e720 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1e730 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1e740 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1e750 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
1e760 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1e770 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1e780 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1e790 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1e7a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1e7b0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1e7c0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1e7d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1e7e0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1e7f0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1e800 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1e810 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1e820 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1e830 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1e840 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1e850 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1e860 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1e870 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1e880 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1e890 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e8a0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e8b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e8c0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1e8d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e8e0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1e8f0 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1e900 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e910 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
1e920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e930 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
1e940 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e950 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e960 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e970 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e980 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1e990 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e9a0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1e9b0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1e9c0 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
1e9d0 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1e9e0 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1e9f0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1ea00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ea10 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ea20 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1ea30 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1ea40 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  est, SQLITE_NULL
1ea50 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
1ea60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ea70 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56  =TK_EQ);.      V
1ea80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ea90 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20   op==TK_NE);.   
1eaa0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1eab0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1eac0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ead0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1eae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1eaf0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1eb00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
1eb10 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
1eb20 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
1eb30 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
1eb40 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1eb50 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
1eb60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1eb70 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
1eb80 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
1eb90 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
1eba0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ebb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ebc0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ebd0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1ebe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ebf0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
1ec00 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
1ec10 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ec20 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
1ec30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1ec40 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1ec50 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
1ec60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ec70 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ec80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ec90 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
1eca0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
1ecb0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ecc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
1ecd0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
1ece0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
1ecf0 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   1, jumpIfNull);
1ed00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ed10 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ed20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1ed30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1ed40 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
1ed50 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
1ed60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1ed70 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
1ed80 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49  stIfNull = jumpI
1ed90 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64  fNull ? dest : d
1eda0 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20  estIfFalse;.    
1edb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1edc0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
1edd0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
1ede0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
1edf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1ee00 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
1ee10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1ee20 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
1ee30 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
1ee40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1ee50 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1ee60 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t: {.      if( e
1ee70 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
1ee80 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1ee90 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1eea0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
1eeb0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
1eec0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
1eed0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
1eee0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
1eef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1ef00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ef10 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1ef20 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
1ef30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ef40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ef50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
1ef60 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
1ef70 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1ef80 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
1ef90 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1efa0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
1efb0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1efc0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1efd0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1efe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1eff0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f000 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1f010 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
1f020 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1f030 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
1f040 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
1f050 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f060 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1f070 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1f080 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1f090 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1f0a0 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1f0b0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
1f0c0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1f0d0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1f0e0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1f0f0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
1f100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1f110 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1f120 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1f130 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1f140 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
1f150 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
1f160 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1f170 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
1f180 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
1f190 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
1f1a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1f1b0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
1f1c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1f1d0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1f1e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1f1f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1f200 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1f210 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1f220 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1f230 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1f240 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1f250 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1f260 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1f270 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1f280 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1f290 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
1f2a0 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
1f2b0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1f2c0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1f2d0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1f2e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
1f2f0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
1f300 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
1f310 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
1f320 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1f330 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
1f340 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
1f350 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
1f360 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
1f370 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
1f380 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
1f390 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
1f3a0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
1f3b0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
1f3c0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
1f3d0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
1f3e0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
1f3f0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
1f400 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
1f410 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
1f420 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
1f430 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
1f440 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
1f450 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
1f460 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
1f470 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
1f480 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
1f490 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
1f4a0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
1f4b0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
1f4c0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
1f4d0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
1f4e0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
1f4f0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
1f500 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
1f510 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
1f520 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
1f530 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
1f540 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
1f550 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
1f560 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
1f570 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
1f580 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
1f590 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
1f5a0 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
1f5b0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
1f5c0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
1f5d0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
1f5e0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
1f5f0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
1f600 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1f610 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
1f620 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f630 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
1f640 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
1f650 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f660 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
1f670 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
1f680 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f690 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
1f6a0 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
1f6b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f6c0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
1f6d0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
1f6e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1f6f0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
1f700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f710 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
1f720 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
1f730 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f740 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
1f750 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
1f760 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f770 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
1f780 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
1f790 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1f7a0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1f7b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f7c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f7d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f7e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1f7f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1f800 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f820 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1f830 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1f840 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1f850 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f860 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1f870 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f880 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f890 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f8a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f8b0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1f8c0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
1f8d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f8e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
1f8f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1f900 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1f910 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1f920 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f930 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49  pLeft, d2, jumpI
1f940 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
1f950 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1f960 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f970 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1f980 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f990 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f9a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
1f9b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f9c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f9d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1f9e0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
1f9f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1fa00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1fa10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fa20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
1fa30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fa40 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1fa50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1fa60 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1fa70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1fa80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fa90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1faa0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fab0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1fac0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1fad0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1fae0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1faf0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1fb00 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
1fb10 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1fb20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1fb30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fb40 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fb50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fb60 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1fb70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1fb80 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fb90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1fba0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1fbb0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1fbc0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fbd0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1fbe0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1fbf0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1fc00 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1fc10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fc20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1fc30 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1fc40 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1fc50 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1fc60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fc70 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1fc80 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1fc90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1fca0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1fcb0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1fcc0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1fcd0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1fce0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fcf0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1fd00 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1fd10 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1fd20 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1fd30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1fd40 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1fd50 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
1fd60 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
1fd70 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
1fd80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1fd90 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61  =OP_Eq);.      a
1fda0 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1fdb0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1fdc0 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1fdd0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1fde0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ne);.      tes
1fdf0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fe00 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1fe10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fe20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fe30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fe40 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1fe50 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
1fe60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1fe70 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
1fe80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fe90 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
1fea0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1feb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fec0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fed0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fee0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1fef0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1ff00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ff10 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1ff20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1ff30 20 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70   op = (pExpr->op
1ff40 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45  ==TK_IS) ? TK_NE
1ff50 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   : TK_EQ;.      
1ff60 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1ff70 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ff80 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ff90 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1ffa0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1ffb0 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  est, SQLITE_NULL
1ffc0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
1ffd0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ffe0 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56  =TK_EQ);.      V
1fff0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20000 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20   op==TK_NE);.   
20010 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
20020 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
20030 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20040 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
20050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20060 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
20070 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
20080 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72  TNULL: {.      r
20090 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
200a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
200b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
200c0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
200d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
200e0 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
200f0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
20100 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
20110 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72  L );   VdbeCover
20120 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
20130 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  ISNULL);.      t
20140 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
20150 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65  NOTNULL );  Vdbe
20160 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20170 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
20180 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
20190 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
201a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
201b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
201c0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
201d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
201e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
201f0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
20200 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
20210 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 0, jumpIfNul
20220 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
20230 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
20240 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20250 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
20260 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
20270 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
20280 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20290 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
202a0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
202b0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
202c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
202d0 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
202e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
202f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20300 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
20310 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
20320 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
20330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20340 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
20350 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
20360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20370 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
20380 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
20390 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
203a0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
203b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
203c0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
203d0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
203e0 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73  e if( exprAlways
203f0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
20400 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
20410 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
20420 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
20430 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20440 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20450 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
20460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20470 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
20480 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
20490 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
204a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
204b0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e(v);.        te
204c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
204d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
204e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
204f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
20500 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
20510 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
20520 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
20530 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
20540 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
20550 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20560 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d  se, regFree2);.}
20570 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c  ../*.** Like sql
20580 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20590 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20  ) except that a 
205a0 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
205b0 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20  pExpr before.** 
205c0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c  code generation,
205d0 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69   and that copy i
205e0 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20  s deleted after 
205f0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
20600 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73   This.** ensures
20610 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
20620 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68  al pExpr is unch
20630 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
20640 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
20650 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  eDup(Parse *pPar
20660 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
20670 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75   int dest,int ju
20680 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c  mpIfNull){.  sql
20690 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
206a0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
206b0 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
206c0 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
206d0 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
206e0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
206f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
20700 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
20710 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75   pCopy, dest, ju
20720 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
20730 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
20740 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d  te(db, pCopy);.}
20750 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  .../*.** Do a de
20760 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
20770 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
20780 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30  trees.  Return 0
20790 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
207a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63  xpressions are c
207b0 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69  ompletely identi
207c0 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69  cal.  Return 1 i
207d0 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e  f they differ on
207e0 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41  ly.** by a COLLA
207f0 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74  TE operator at t
20800 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52  he top level.  R
20810 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65  eturn 2 if there
20820 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
20830 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74  .** other than t
20840 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c  he top-level COL
20850 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
20860 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
20870 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
20880 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
20890 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
208a0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
208b0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
208c0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
208d0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
208e0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
208f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69  .**.** The pA si
20900 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e  de might be usin
20910 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20  g TK_REGISTER.  
20920 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
20930 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a  ase and pB is.**
20940 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45   not using TK_RE
20950 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74  GISTER but is ot
20960 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65  herwise equivale
20970 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  nt, then still r
20980 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53  eturn 0..**.** S
20990 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
209a0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
209b0 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20  n 2 even if the 
209c0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  two expressions.
209d0 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71  ** really are eq
209e0 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65  uivalent.  If we
209f0 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68   cannot prove th
20a00 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
20a10 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69  ns are.** identi
20a20 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32  cal, we return 2
20a30 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
20a40 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
20a50 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
20a60 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20   2, then you do 
20a70 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
20a80 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
20a90 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
20aa0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
20ab0 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
20ac0 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74  get a 0 or 1 ret
20ad0 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
20ae0 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
20af0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
20b00 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
20b10 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
20b20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
20b30 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
20b40 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
20b50 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68   an extra 2 - th
20b60 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
20b70 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
20b80 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
20b90 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
20ba0 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
20bb0 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c  rect 0 or 1 coul
20bc0 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
20bd0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
20be0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20bf0 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
20c00 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  r *pB, int iTab)
20c10 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64  {.  u32 combined
20c20 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d  Flags;.  if( pA=
20c30 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20  =0 || pB==0 ){. 
20c40 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41     return pB==pA
20c50 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20   ? 0 : 2;.  }.  
20c60 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20  combinedFlags = 
20c70 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e  pA->flags | pB->
20c80 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d  flags;.  if( com
20c90 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
20ca0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
20cb0 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70  if( (pA->flags&p
20cc0 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56  B->flags&EP_IntV
20cd0 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e  alue)!=0 && pA->
20ce0 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e  u.iValue==pB->u.
20cf0 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  iValue ){.      
20d00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
20d10 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
20d20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
20d30 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66  pB->op ){.    if
20d40 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pA->op==TK_COL
20d50 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
20d60 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
20d70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c  Left, pB, iTab)<
20d80 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
20d90 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
20da0 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pB->op==TK_CO
20db0 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
20dc0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20  ExprCompare(pA, 
20dd0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
20de0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
20df0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
20e00 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
20e10 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
20e20 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21  OLUMN && pA->op!
20e30 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26  =TK_AGG_COLUMN &
20e40 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
20e50 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70  {.    if( pA->op
20e60 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  ==TK_FUNCTION ){
20e70 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
20e80 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e  e3StrICmp(pA->u.
20e90 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
20ea0 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ken)!=0 ) return
20eb0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
20ec0 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a  ( strcmp(pA->u.z
20ed0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
20ee0 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
20ef0 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54  return pA->op==T
20f00 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20  K_COLLATE ? 1 : 
20f10 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
20f20 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
20f30 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
20f40 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
20f50 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
20f60 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   2;.  if( ALWAYS
20f70 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
20f80 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
20f90 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0) ){.    if( c
20fa0 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
20fb0 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65  P_xIsSelect ) re
20fc0 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
20fd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20fe0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
20ff0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29  ->pLeft, iTab) )
21000 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
21010 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
21020 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
21030 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54  , pB->pRight, iT
21040 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
21050 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21060 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
21070 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e  A->x.pList, pB->
21080 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29  x.pList, iTab) )
21090 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
210a0 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69  f( ALWAYS((combi
210b0 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65  nedFlags & EP_Re
210c0 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41  duced)==0) && pA
210d0 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op!=TK_STRING 
210e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  ){.      if( pA-
210f0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
21100 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32  olumn ) return 2
21110 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  ;.      if( pA->
21120 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
21130 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70  le .       && (p
21140 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  A->iTable!=iTab 
21150 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61  || NEVER(pB->iTa
21160 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72  ble>=0)) ) retur
21170 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 2;.    }.  }. 
21180 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21190 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
211a0 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
211b0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
211c0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
211d0 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65  l and .** non-ze
211e0 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65  ro if they diffe
211f0 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
21200 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
21210 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
21220 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
21230 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
21240 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
21250 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
21260 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
21270 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
21280 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
21290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
212a0 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ne might return 
212b0 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75  non-zero for equ
212c0 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74  ivalent ExprList
212d0 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  s.  The.** only 
212e0 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  consequence will
212f0 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74   be disabled opt
21300 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74  imizations.  But
21310 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
21320 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75   must never retu
21330 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
21340 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73  ExprList objects
21350 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
21360 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74  or.** a malfunct
21370 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e  ion will result.
21380 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
21390 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e  pointers are con
213a0 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68  sidered to be th
213b0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e  e same.  But a N
213c0 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61  ULL pointer.** a
213d0 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72  lways differs fr
213e0 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f  om a non-NULL po
213f0 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
21400 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
21410 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70  pare(ExprList *p
21420 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c  A, ExprList *pB,
21430 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e   int iTab){.  in
21440 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
21450 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75   && pB==0 ) retu
21460 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d  rn 0;.  if( pA==
21470 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74  0 || pB==0 ) ret
21480 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d  urn 1;.  if( pA-
21490 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70  >nExpr!=pB->nExp
214a0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
214b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e  for(i=0; i<pA->n
214c0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
214d0 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
214e0 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  A->a[i].pExpr;. 
214f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20     Expr *pExprB 
21500 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pB->a[i].pExpr
21510 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b  ;.    if( pA->a[
21520 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42  i].sortOrder!=pB
21530 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
21540 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
21550 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
21560 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20  Compare(pExprA, 
21570 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20  pExprB, iTab) ) 
21580 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21590 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
215a0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
215b0 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74  f we can prove t
215c0 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61  he pE2 will alwa
215d0 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45  ys be true if pE
215e0 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52  1 is.** true.  R
215f0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77  eturn false if w
21600 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74  e cannot complet
21610 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69  e the proof or i
21620 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62  f pE2 might.** b
21630 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c  e false.  Exampl
21640 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45  es:.**.**     pE
21650 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45  1: x==5       pE
21660 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
21670 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
21680 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30  .**     pE1: x>0
21690 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d          pE2: x==
216a0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
216b0 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
216c0 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20     pE1: x=21    
216d0 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20     pE2: x=21 OR 
216e0 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a  y=43     Result:
216f0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
21700 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32  : x!=123     pE2
21710 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
21720 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
21730 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f  **     pE1: x!=?
21740 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  1      pE2: x IS
21750 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
21760 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
21770 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20   pE1: x IS NULL 
21780 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
21790 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66  ULL    Result: f
217a0 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  alse.**     pE1:
217b0 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a   x IS ?2    pE2:
217c0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
217d0 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a    Reuslt: false.
217e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61  **.** When compa
217f0 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  ring TK_COLUMN n
21800 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31  odes between pE1
21810 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32   and pE2, if pE2
21820 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61   has.** Expr.iTa
21830 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d  ble<0 then assum
21840 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  e a table number
21850 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a   given by iTab..
21860 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f  **.** When in do
21870 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ubt, return fals
21880 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72  e.  Returning tr
21890 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  ue might give a 
218a0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
218b0 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74  mprovement.  Ret
218c0 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67  urning false mig
218d0 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f  ht cause a perfo
218e0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
218f0 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c  , but.** it will
21900 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65   always give the
21910 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
21920 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77  and is hence alw
21930 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74  ays safe..*/.int
21940 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
21950 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45  iesExpr(Expr *pE
21960 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e  1, Expr *pE2, in
21970 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73  t iTab){.  if( s
21980 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21990 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62  e(pE1, pE2, iTab
219a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
219b0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
219c0 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20  pE2->op==TK_OR. 
219d0 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70    && (sqlite3Exp
219e0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
219f0 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
21a00 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab).            
21a10 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
21a20 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
21a30 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  pE2->pRight, iTa
21a40 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  b) ).  ){.    re
21a50 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
21a60 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  ( pE2->op==TK_NO
21a70 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69  TNULL.   && sqli
21a80 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21a90 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e  E1->pLeft, pE2->
21aa0 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a  pLeft, iTab)==0.
21ab0 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d     && (pE1->op!=
21ac0 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31  TK_ISNULL && pE1
21ad0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29  ->op!=TK_IS).  )
21ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21af0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
21b00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  }../*.** An inst
21b10 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
21b20 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
21b30 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74  is used by the t
21b40 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f  ree walker.** to
21b50 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65   count reference
21b60 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d  s to table colum
21b70 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ns in the argume
21b80 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67  nts of an .** ag
21b90 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21ba0 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d  , in order to im
21bb0 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73  plement the.** s
21bc0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68  qlite3FunctionTh
21bd0 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e  isSrc() routine.
21be0 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f  .*/.struct SrcCo
21bf0 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20  unt {.  SrcList 
21c00 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20  *pSrc;   /* One 
21c10 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20  particular FROM 
21c20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74  clause in a nest
21c30 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ed query */.  in
21c40 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f  t nThis;       /
21c50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
21c60 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
21c70 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f  s in pSrcList */
21c80 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20  .  int nOther;  
21c90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21ca0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
21cb0 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20  olumns in other 
21cc0 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a  FROM clauses */.
21cd0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  };../*.** Count 
21ce0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
21cf0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
21d00 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  mns..*/.static i
21d10 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28  nt exprSrcCount(
21d20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
21d30 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
21d40 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20   /* The NEVER() 
21d50 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65  on the second te
21d60 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71  rm is because sq
21d70 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
21d80 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20  sThisSrc().  ** 
21d90 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64  is always called
21da0 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45   before sqlite3E
21db0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
21dc0 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68  ates() and so th
21dd0 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  e.  ** TK_COLUMN
21de0 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  s have not yet b
21df0 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  een converted in
21e00 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
21e10 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74  .  If.  ** sqlit
21e20 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
21e30 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20  isSrc() is used 
21e40 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74  differently in t
21e50 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20  he future, the. 
21e60 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c   ** NEVER() will
21e70 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f   need to be remo
21e80 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45  ved. */.  if( pE
21e90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
21ea0 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70  MN || NEVER(pExp
21eb0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
21ec0 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74  LUMN) ){.    int
21ed0 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   i;.    struct S
21ee0 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61  rcCount *p = pWa
21ef0 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e  lker->u.pSrcCoun
21f00 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
21f10 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
21f20 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
21f30 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63  Src ? pSrc->nSrc
21f40 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
21f50 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
21f60 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
21f70 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
21f80 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
21f90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
21fa0 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20  if( i<nSrc ){.  
21fb0 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a      p->nThis++;.
21fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21fd0 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20   p->nOther++;.  
21fe0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21ff0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22000 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
22010 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
22020 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
22030 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20   pExpr Function 
22040 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72  reference.** pSr
22050 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74  cList.  Return t
22060 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20  rue if they do. 
22070 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
22080 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e if the functio
22090 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75  n.** has no argu
220a0 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c  ments or has onl
220b0 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  y constant argum
220c0 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61  ents.  Return fa
220d0 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20  lse if pExpr.** 
220e0 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d  references colum
220f0 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d  ns but not colum
22100 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75  ns of tables fou
22110 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a  nd in pSrcList..
22120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75  */.int sqlite3Fu
22130 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
22140 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53  c(Expr *pExpr, S
22150 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
22160 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
22170 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
22180 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20   cnt;.  assert( 
22190 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
221a0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
221b0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
221c0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
221d0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
221e0 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e  prSrcCount;.  w.
221f0 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63  u.pSrcCount = &c
22200 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d  nt;.  cnt.pSrc =
22210 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74   pSrcList;.  cnt
22220 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e  .nThis = 0;.  cn
22230 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20  t.nOther = 0;.  
22240 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
22250 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78  ist(&w, pExpr->x
22260 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  .pList);.  retur
22270 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c  n cnt.nThis>0 ||
22280 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a   cnt.nOther==0;.
22290 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
222a0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
222b0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
222c0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
222d0 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
222e0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
222f0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
22300 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
22310 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
22320 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
22330 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
22340 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
22350 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
22360 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
22370 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
22380 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
22390 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
223a0 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
223b0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
223c0 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26  ol[0]),.       &
223d0 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
223e0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
223f0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
22400 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
22410 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
22420 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
22430 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
22440 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
22450 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
22460 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
22470 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
22480 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
22490 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
224a0 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
224b0 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
224c0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
224d0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
224e0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
224f0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
22500 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
22510 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
22520 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
22530 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
22540 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
22550 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
22560 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
22570 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
22580 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63  the xExprCallbac
22590 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c  k for a tree wal
225a0 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64  ker.  It is used
225b0 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
225c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
225d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
225e0 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
225f0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
22600 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
22610 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
22620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22630 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
22640 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22650 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
22660 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
22670 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
22680 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
22690 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
226a0 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
226b0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
226c0 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
226d0 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
226e0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
226f0 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68  gInfo;..  switch
22700 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
22710 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
22720 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
22730 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
22740 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
22750 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
22760 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
22770 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
22780 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
22790 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
227a0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
227b0 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
227c0 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
227d0 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
227e0 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
227f0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
22800 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
22810 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29  AYS(pSrcList!=0)
22820 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
22830 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22840 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
22850 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
22860 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
22870 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
22880 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
22890 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
228a0 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
228b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
228c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
228d0 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
228e0 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
228f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22900 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
22910 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
22920 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22930 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22940 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
22950 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
22960 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
22970 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
22980 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
22990 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
229a0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
229b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
229c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
229d0 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
229e0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
229f0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
22a00 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
22a10 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
22a20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
22a30 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
22a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22a50 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
22a60 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
22a70 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
22a80 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
22a90 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
22aa0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
22ab0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22ac0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
22ad0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
22ae0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
22af0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
22b00 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
22b10 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
22b20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22b40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22b50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
22b60 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
22b70 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
22b80 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
22b90 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
22ba0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
22bb0 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
22bc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
22bd0 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
22be0 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22c00 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
22c10 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
22c20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
22c30 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
22c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22c50 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
22c60 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22c80 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
22c90 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22ca0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
22cb0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
22cc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
22cd0 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
22ce0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22cf0 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
22d00 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
22d20 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
22d30 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
22d40 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
22d50 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
22d60 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
22d70 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
22d80 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
22d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22da0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
22db0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22dc0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
22dd0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
22e00 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
22e10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22e20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
22e30 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
22e40 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
22e50 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
22e60 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
22e70 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
22e80 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
22e90 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22ea0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
22eb0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
22ec0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22ef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22f10 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
22f20 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
22f50 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
22f60 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
22f70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22f80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
22f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22fa0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
22fb0 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
22fc0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
22fd0 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
22fe0 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
22ff0 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
23000 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
23010 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
23020 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
23030 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
23040 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
23050 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
23060 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
23070 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
23080 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
23090 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
230a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
230b0 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
230c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
230d0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
230e0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
230f0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
23100 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
23110 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
23120 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
23130 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
23140 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20  = (i16)k;.      
23150 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23160 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
23170 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
23180 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
23190 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
231a0 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
231b0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
231c0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
231d0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
231e0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
231f0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
23200 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
23210 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75  ags & NC_InAggFu
23220 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  nc)==0.       &&
23230 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
23240 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70  Depth==pExpr->op
23250 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  2.      ){.     
23260 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
23270 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
23280 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
23290 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
232a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
232b0 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
232c0 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
232d0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
232e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
232f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
23300 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
23310 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
23320 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
23330 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
23340 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
23350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23360 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
23370 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
23380 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  , pExpr, -1)==0 
23390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
233a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
233b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
233c0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
233d0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
233e0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
233f0 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
23400 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
23410 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
23420 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
23430 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
23440 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
23450 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
23460 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
23470 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
23480 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
23490 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
234a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
234b0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
234c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
234d0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
234e0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
234f0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
23500 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
23510 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
23520 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
23530 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
23540 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
23560 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23570 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23580 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
23590 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
235a0 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
235b0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
235c0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
235d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
235e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c  r->u.zToken, sql
235f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
23600 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20  pr->u.zToken),. 
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
23630 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
23640 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
23650 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
23660 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
23670 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
23680 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
23690 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
236a0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
236b0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
236c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
236d0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
236e0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
236f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23710 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
23720 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
23730 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
23740 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
23750 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
23760 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
23770 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23780 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
23790 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
237a0 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
237b0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
237c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
237d0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
237e0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
237f0 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
23800 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
23810 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
23820 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
23830 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
23840 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23850 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
23860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23870 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
23880 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
23890 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
238a0 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
238b0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
238c0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
238d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
238e0 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20  TER(pWalker);.  
238f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23900 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  (pSelect);.  ret
23910 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
23930 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
23940 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
23950 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
23960 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
23970 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
23980 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
23990 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
239a0 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
239b0 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
239c0 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
239d0 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
239e0 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
239f0 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
23a00 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
23a10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
23a20 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
23a30 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
23a40 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
23a50 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
23a60 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
23a70 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
23a80 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
23a90 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
23aa0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
23ab0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
23ac0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
23ad0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
23ae0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
23af0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
23b00 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
23b10 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
23b20 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
23b30 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
23b40 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
23b50 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
23b60 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
23b70 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
23b80 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
23b90 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
23ba0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
23bb0 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
23bc0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23bd0 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
23be0 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
23bf0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
23c00 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
23c10 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
23c20 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
23c30 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
23c40 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
23c50 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
23c60 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
23c70 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
23c80 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
23c90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23ca0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
23cb0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
23cc0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
23cd0 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
23ce0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
23cf0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
23d00 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
23d10 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
23d20 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
23d30 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23d40 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
23d50 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
23d60 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
23d70 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
23d80 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
23d90 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
23da0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
23db0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
23dc0 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
23dd0 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
23de0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
23df0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
23e00 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
23e10 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
23e20 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
23e30 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
23e40 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
23e50 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
23e60 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
23e70 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
23e80 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
23e90 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
23ea0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
23eb0 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
23ec0 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  deallocation is 
23ed0 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
23ee0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
23ef0 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
23f00 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
23f10 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
23f20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
23f30 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
23f40 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
23f50 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
23f60 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
23f70 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
23f80 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
23f90 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23fa0 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
23fb0 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
23fc0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
23fd0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
23fe0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
23ff0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
24000 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
24010 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
24020 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
24030 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
24040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
24050 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
24060 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
24070 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
24080 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
24090 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
240a0 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
240b0 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
240c0 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
240d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
240e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
240f0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
24100 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
24110 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
24120 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
24130 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
24140 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
24150 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
24160 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
24170 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
24180 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
24190 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
241a0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
241b0 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
241c0 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
241d0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
241e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
241f0 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
24200 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
24210 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
24220 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
24230 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
24240 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
24250 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
24260 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
24270 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
24280 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
24290 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
242a0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
242b0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
242c0 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
242d0 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
242e0 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
242f0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
24300 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
24310 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
24320 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
24330 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
24340 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
24350 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
24360 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
24370 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
24380 7d 0a                                            }.