/ Hex Artifact Content
Login

Artifact fe55c489362d1429c364e98c877514f4455f45a6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  TK_COLLATE opera
0be0: 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c  tors and any unl
0bf0: 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69  ikely().** or li
0c00: 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74  kelihood() funct
0c10: 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20  ion at the root 
0c20: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
0c30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0c40: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
0c50: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
0c60: 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26    while( pExpr &
0c70: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
0c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70  y(pExpr, EP_Skip
0c90: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  ) ){.    if( Exp
0ca0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0cb0: 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29  pr, EP_Unlikely)
0cc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
0cd0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
0ce0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
0cf0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
0d00: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0d10: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  x.pList->nExpr>0
0d20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0d40: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
0d50: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
0d60: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
0d70: 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
0d80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0d90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
0da0: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 45  LATE );.      pE
0db0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
0dc0: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ft;.    }.  }   
0dd0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0df0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
0e00: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0e10: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0e20: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0e30: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
0e40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
0e50: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
0e60: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0e70: 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20   sequence might 
0e80: 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
0e90: 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
0ea0: 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65  tor.** or by the
0eb0: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63   presence of a c
0ec0: 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66  olumn with a def
0ed0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0ee0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c  equence..** COLL
0ef0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61  ATE operators ta
0f00: 6b 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65  ke first precede
0f10: 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61  nce.  Left opera
0f20: 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63  nds take.** prec
0f30: 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68  edence over righ
0f40: 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43  t operands..*/.C
0f50: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
0f60: 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  xprCollSeq(Parse
0f70: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0f80: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
0f90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0fa0: 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  db;.  CollSeq *p
0fb0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
0fc0: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
0fd0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
0fe0: 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  nt op = p->op;. 
0ff0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
1000: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 62  & EP_Generic ) b
1010: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70  reak;.    if( op
1020: 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d  ==TK_CAST || op=
1030: 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20  =TK_UPLUS ){.   
1040: 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b     p = p->pLeft;
1050: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
1070: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
1080: 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45   (op==TK_REGISTE
1090: 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f  R && p->op2==TK_
10a0: 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20 20  COLLATE) ){.    
10b0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10c0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
10d0: 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30 2c 20  se, ENC(db), 0, 
10e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
10f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1100: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
1110: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
1120: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
1130: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b         || op==TK
1140: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
1150: 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20  =TK_TRIGGER).   
1160: 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a    && p->pTab!=0.
1170: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
1180: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1190: 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61  && p->pTab!=0 ha
11a0: 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72  ppens when pExpr
11b0: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
11c0: 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f        ** a TK_CO
11d0: 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65  LUMN but was pre
11e0: 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65  viously evaluate
11f0: 64 20 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20  d and cached in 
1200: 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  a register */.  
1210: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69      int j = p->i
1220: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66  Column;.      if
1230: 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1250: 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61  oll = p->pTab->a
1260: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1270: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1280: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
1290: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
12a0: 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  oll, 0);.      }
12b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
12d0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
12e0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
12f0: 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70  ->pLeft && (p->p
1300: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1310: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1320: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1330: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1340: 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  e{.        Expr 
1350: 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69  *pNext  = p->pRi
1360: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ght;.        /* 
1370: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
1380: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
1390: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
13a0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
13b0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13c0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
13d0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
13e0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  );.        /* p-
13f0: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
1400: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
1410: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
1420: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
1430: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
1440: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
1450: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1460: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1470: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1480: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
1490: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
14a0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
14b0: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
14c0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d  if( p->x.pList!=
14d0: 30 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70  0 && ALWAYS(!Exp
14e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
14f0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1500: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1510: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
1520: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
1530: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1540: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1550: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1560: 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c  Property(p->x.pL
1570: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1580: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a   EP_Collate) ){.
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
15a0: 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74  ext = p->x.pList
15b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
15e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1600: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
1610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1630: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1640: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1650: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
1660: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
1670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1680: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
1690: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
16a0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
16b0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
16c0: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
16d0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
16e0: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
16f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1700: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1710: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1720: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1730: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1740: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1750: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
1760: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
1770: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
1780: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
1790: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
17a0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
17b0: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
17c0: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
17d0: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
17e0: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
17f0: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1800: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1810: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1820: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1830: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1840: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1850: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1860: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
1870: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1880: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
1890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
18b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
18e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
18f0: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1900: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1910: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1920: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1930: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1940: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
1950: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
1960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1970: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73  AFF_BLOB;.  }els
1980: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
1990: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
19a0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
19b0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
19c0: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
19d0: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
19e0: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
19f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1a00: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1a10: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1a20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1a30: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1a40: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
1a50: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
1a60: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
1a70: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
1a80: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
1a90: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
1aa0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1ab0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1ac0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1ad0: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1ae0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1af0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1b00: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1b10: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1b20: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1b30: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1b40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
1b50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
1b60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
1b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
1b80: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1b90: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
1ba0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
1bb0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1bc0: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1bd0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1be0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1bf0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1c00: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1c10: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1c20: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1c30: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1c40: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
1c50: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c70: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1c80: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1c90: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
1ca0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1cb0: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1cd0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1ce0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1cf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1d10: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1d20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1d30: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1d40: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
1d50: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
1d60: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
1d70: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
1d80: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
1d90: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
1da0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1db0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1dc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1dd0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1de0: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1df0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1e00: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1e10: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1e20: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1e30: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1e40: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1e50: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1e60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e70: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
1e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1e90: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1ea0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1eb0: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1ec0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1ed0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1ee0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1ef0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1f00: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1f30: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1f40: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1f50: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1f60: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1f70: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1f80: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1f90: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1fb0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1fc0: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1fd0: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1fe0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1ff0: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
2000: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
2010: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
2020: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
2030: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
2040: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
2050: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
2060: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2070: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2080: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
2090: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
20a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
20b0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
20c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
20d0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
20e0: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
2100: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
2110: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
2120: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
2130: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
2140: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
2150: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2160: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
2170: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
2180: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
2190: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
21a0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
21b0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
21c0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
21d0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
21e0: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
21f0: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
2200: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
2210: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
2220: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
2230: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
2240: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
2250: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2260: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
2270: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
2280: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
2290: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
22a0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
22b0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
22c0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
22d0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
22e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
22f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2300: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2310: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2320: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
2330: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2340: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
2350: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2360: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2370: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
2380: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2390: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
23a0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
23b0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
23c0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
23d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
23e0: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
23f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2400: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2410: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2420: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2430: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2450: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
2460: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
2470: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
2480: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
2490: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
24a0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
24b0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
24c0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
24d0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
24e0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
24f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2500: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2510: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2520: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2530: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2540: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
2550: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
2560: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
2570: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
2580: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
2590: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
25a0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
25b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
25c0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
25d0: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
25e0: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
25f0: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2600: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2610: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2620: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2630: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2640: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
2650: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
2660: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2670: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
2680: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
2690: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
26a0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
26c0: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
26d0: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
26e0: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
26f0: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2700: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2710: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2720: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2730: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2740: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
2750: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
2760: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2770: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
2780: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
2790: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
27a0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
27b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
27c0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
27d0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
27e0: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
27f0: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2800: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2810: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2820: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2830: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2840: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
2850: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
2860: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
2870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2880: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
2890: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
28a0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
28b0: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
28c0: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
28d0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
28e0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
28f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2900: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2910: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2920: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2930: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2940: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
2950: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
2960: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
2970: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
2980: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
2990: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
29a0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
29b0: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
29c0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
29d0: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
29e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
29f0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2a00: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2a10: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2a20: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2a30: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2a40: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
2a50: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
2a60: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
2a70: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
2a80: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2a90: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2aa0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2ab0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2ac0: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2ad0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2ae0: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2af0: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2b00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2b10: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2b20: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2b30: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2b40: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
2b50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b60: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
2b70: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
2b80: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
2b90: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2ba0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2bb0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2bc0: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2bd0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2be0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2bf0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2c00: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2c10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c20: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2c30: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c40: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
2c50: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
2c60: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2c70: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
2c80: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2c90: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2ca0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
2cb0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2cc0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2cd0: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2ce0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2cf0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2d00: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d10: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2d20: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2d30: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2d40: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2d50: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2d60: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
2d70: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
2d80: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
2d90: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2da0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2db0: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2dc0: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2dd0: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2de0: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2df0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2e00: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2e10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2e20: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2e30: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2e40: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2e50: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
2e60: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
2e70: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
2e80: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
2e90: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
2ea0: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
2eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ec0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2ed0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2ee0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2ef0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2f00: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2f10: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2f20: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2f30: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2f40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2f50: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2f60: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2f70: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
2f80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
2f90: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
2fa0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2fb0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2fc0: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2fd0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
2fe0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
2ff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
3000: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
3010: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
3020: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
3030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
3040: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
3050: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
3060: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
3070: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
3080: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
3090: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
30a0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
30b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
30c0: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
30d0: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
30e0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
30f0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
3100: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
3110: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
3120: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
3130: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
3140: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
3150: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
3160: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3170: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
3180: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
3190: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
31a0: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
31b0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
31c0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
31d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
31e0: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
31f0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
3200: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
3210: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
3220: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
3230: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
3240: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
3250: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
3260: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
3270: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
3280: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
3290: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
32a0: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
32b0: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
32c0: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
32d0: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
32e0: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
32f0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
3300: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
3310: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
3320: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
3330: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
3340: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
3350: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
3360: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3370: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
3380: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
3390: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
33a0: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
33b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
33c0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
33d0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
33e0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
33f0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
3400: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3410: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
3420: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
3430: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
3440: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
3450: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
3460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3470: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
3480: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
3490: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
34a0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
34b0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
34c0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
34d0: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
34e0: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
34f0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
3500: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
3510: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
3520: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
3530: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
3540: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
3550: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
3560: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
3570: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
3580: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
3590: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
35a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
35b0: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
35c0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
35d0: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
35e0: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
35f0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
3600: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
3610: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
3620: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
3630: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
3640: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
3650: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
3660: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
3670: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
3680: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
3690: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
36a0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
36b0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
36c0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
36d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
36e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
36f0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
3700: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
3710: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
3720: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
3730: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
3740: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
3750: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
3760: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
3770: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
3780: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
3790: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
37a0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
37b0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
37c0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
37d0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
37e0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
37f0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
3800: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
3810: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
3820: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
3830: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
3840: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
3850: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3860: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
3870: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3880: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3890: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38a0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
38b0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
38c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38d0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
38e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
38f0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
3900: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3910: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3920: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
3930: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
3940: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
3950: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
3960: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
3970: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
3980: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
3990: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
39a0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
39b0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
39c0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
39d0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
39e0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
39f0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3a00: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3a10: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3a20: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3a30: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3a40: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3a50: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3a60: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a70: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3a80: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
3a90: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
3aa0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
3ab0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
3ac0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
3ad0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
3ae0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
3af0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
3b00: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3b10: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
3b20: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
3b30: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
3b40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b50: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
3b60: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3b70: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
3b80: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
3b90: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
3ba0: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
3bb0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
3bc0: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
3bd0: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
3be0: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
3bf0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
3c00: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3c10: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
3c20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
3c30: 71 75 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e  quote && nExtra>
3c40: 3d 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =3 .            
3c50: 20 26 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e   && ((c = pToken
3c60: 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c  ->z[0])=='\'' ||
3c70: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b   c=='"' || c=='[
3c80: 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a  ' || c=='`') ){.
3c90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3ca0: 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Dequote(pNew->u
3cb0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
3cc0: 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29      if( c=='"' )
3cd0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
3ce0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
3cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3d00: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
3d10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
3d20: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
3d30: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
3d40: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
3d50: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
3d60: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
3d70: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
3d80: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
3d90: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
3da0: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
3db0: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
3dc0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3dd0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3df0: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3e00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3e10: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3e20: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3e40: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3e50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3e60: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
3e70: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
3e80: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
3e90: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
3ea0: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
3eb0: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
3ec0: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
3ed0: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
3ee0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
3ef0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
3f00: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
3f10: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
3f20: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
3f30: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
3f40: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
3f50: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
3f60: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
3f70: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
3f80: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
3f90: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
3fa0: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
3fb0: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
3fc0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
3fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
3fe0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3ff0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
4000: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
4010: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
4020: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
4030: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
4040: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
4050: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4070: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4080: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4090: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
40a0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
40b0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
40c0: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
40d0: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
40e0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
40f0: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
4100: 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c  ate & pRight->fl
4110: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ags;.    }.    i
4120: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
4130: 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d    pRoot->pLeft =
4140: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52   pLeft;.      pR
4150: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
4160: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65  _Propagate & pLe
4170: 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ft->flags;.    }
4180: 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67  .    exprSetHeig
4190: 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d  ht(pRoot);.  }.}
41a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
41b0: 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68   an Expr node wh
41c0: 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e  ich joins as man
41d0: 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65  y as two subtree
41e0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20  s..**.** One or 
41f0: 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74  both of the subt
4200: 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rees can be NULL
4210: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
4220: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
4230: 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72  * Expr node.  Or
4240: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
4250: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50  r occurs, set pP
4260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4270: 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20  Failed,.** free 
4280: 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64  the subtrees and
4290: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
42a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45  .Expr *sqlite3PE
42b0: 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  xpr(.  Parse *pP
42c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
42d0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
42e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4300: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
4310: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
4320: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
4330: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
4340: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
4350: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
4360: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
4370: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
4380: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
4390: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
43a0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
43b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
43c0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43d0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43e0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
43f0: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4400: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4410: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4420: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4430: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4440: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4450: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4460: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4470: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26  pParse->db, op &
4480: 20 54 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f   TKFLG_MASK, pTo
4490: 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ken, 1);.    sql
44a0: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
44b0: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
44c0: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
44d0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
44e0: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
44f0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
4500: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
4510: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
4520: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn p;.}../*.** I
4530: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4540: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
4550: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
4560: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
4570: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
4580: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
4590: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
45a0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
45b0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
45c0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
45d0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
45e0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
45f0: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
4600: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
4610: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
4620: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
4630: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
4640: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
4650: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
4660: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
4670: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
4680: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
4690: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
46a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
46b0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
46c0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
46d0: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
46e0: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
46f0: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
4700: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
4710: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
4720: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
4730: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
4740: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
4750: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
4760: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
4770: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
4780: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
4790: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
47a0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
47b0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
47c0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
47d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
47e0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
47f0: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
4800: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
4810: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
4820: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
4830: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
4840: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
4850: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
4860: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
4870: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4880: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
4890: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
48a0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
48b0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
48c0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
48d0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
48e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
48f0: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
4900: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
4910: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
4920: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
4930: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
4940: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
4950: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
4960: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
4970: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
4980: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
4990: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
49a0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
49b0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
49c0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
49d0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
49e0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
49f0: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
4a00: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
4a10: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4a20: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
4a30: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
4a40: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
4a50: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
4a60: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
4a70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
4a80: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
4a90: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
4aa0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
4ab0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
4ac0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
4ad0: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
4ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4af0: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
4b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4b10: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
4b20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
4b30: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
4b40: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
4b50: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
4b60: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
4b70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
4b80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4b90: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
4ba0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4bb0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
4bc0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
4bd0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
4be0: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
4bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
4c00: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
4c10: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
4c20: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
4c30: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
4c40: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
4c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
4c60: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
4c70: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
4c80: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
4c90: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
4ca0: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
4cb0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4cc0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
4cd0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
4ce0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4cf0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
4d00: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
4d10: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
4d20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4d30: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
4d40: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
4d50: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
4d60: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
4d70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4d80: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
4d90: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
4da0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4db0: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
4dc0: 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  ect) );.  sqlite
4dd0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
4de0: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70  dFlags(pParse, p
4df0: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
4e00: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
4e10: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
4e20: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
4e30: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
4e40: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
4e50: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
4e60: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
4e70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
4e80: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
4e90: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
4ea0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4eb0: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
4ec0: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
4ed0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
4ee0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4ef0: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
4f00: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
4f10: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
4f20: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
4f30: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
4f40: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
4f50: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
4f60: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
4f70: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
4f80: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
4f90: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
4fa0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
4fb0: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
4fc0: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
4fd0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
4fe0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
4ff0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
5000: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
5010: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
5020: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
5030: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
5040: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
5050: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
5060: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
5070: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
5080: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
5090: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
50a0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
50b0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
50c0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
50d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
50e0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
50f0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
5100: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5110: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5120: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5130: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
5140: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
5150: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
5160: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
5170: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
5180: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
5190: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
51a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
51b0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
51c0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
51d0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
51e0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
51f0: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
5200: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
5210: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
5220: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
5230: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5240: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
5250: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
5260: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
5270: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
5280: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
5290: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
52a0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
52b0: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
52c0: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
52d0: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
52e0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
52f0: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
5300: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
5310: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
5320: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
5330: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
5340: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5350: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
5360: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
5370: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
5380: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
5390: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
53a0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
53b0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
53c0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
53d0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
53e0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
53f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
5400: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
5410: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
5420: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
5430: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
5440: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
5450: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
5460: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5470: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
5480: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
5490: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
54a0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
54b0: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
54c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
54d0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
54e0: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
54f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5500: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
5510: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
5520: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
5530: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
5540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
5550: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
5560: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
5570: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
5580: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
5590: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
55a0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
55b0: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
55c0: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
55d0: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
55e0: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
55f0: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
5600: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
5610: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
5620: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
5630: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
5640: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
5650: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
5660: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5670: 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63  azVar[i] && strc
5680: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
5690: 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  [i],z)==0 ){.   
56a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
56b0: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
56c0: 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20  ar)i+1;.        
56d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
56e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
56f0: 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
5700: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
5710: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
5720: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a  e->nVar);.    }.
5730: 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20      if( x>0 ){. 
5740: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
5750: 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20  e->nzVar ){.    
5760: 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20      char **a;.  
5770: 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
5780: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
5790: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a  Parse->azVar, x*
57a0: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
57b0: 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20         if( a==0 
57c0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72  ) return;  /* Er
57d0: 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72  ror reported thr
57e0: 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ough db->mallocF
57f0: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
5800: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d   pParse->azVar =
5810: 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   a;.        mems
5820: 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a  et(&a[pParse->nz
5830: 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72  Var], 0, (x-pPar
5840: 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f  se->nzVar)*sizeo
5850: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
5860: 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20    pParse->nzVar 
5870: 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = x;.      }.   
5880: 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27     if( z[0]!='?'
5890: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61   || pParse->azVa
58a0: 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  r[x-1]==0 ){.   
58b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
58c0: 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  ee(db, pParse->a
58d0: 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20  zVar[x-1]);.    
58e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
58f0: 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33  r[x-1] = sqlite3
5900: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c  DbStrNDup(db, z,
5910: 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
5920: 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70   }.  } .  if( !p
5930: 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70  Parse->nErr && p
5940: 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e  Parse->nVar>db->
5950: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5960: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
5970: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
5980: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5990: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
59a0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
59b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
59c0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
59d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
59e0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
59f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
5a00: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5a10: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
5a20: 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61   return;.  /* Sa
5a30: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
5a40: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
5a50: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
5a60: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
5a70: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
5a80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5a90: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
5aa0: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
5ab0: 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  0 );.  if( !Expr
5ac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5ad0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
5ae0: 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e      /* The Expr.
5af0: 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72  x union is never
5b00: 20 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d   used at the sam
5b10: 65 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70  e time as Expr.p
5b20: 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73  Right */.    ass
5b30: 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d  ert( p->x.pList=
5b40: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  =0 || p->pRight=
5b50: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
5b60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5b70: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
5b80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5b90: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
5ba0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
5bb0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
5bc0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
5bd0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5be0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  u.zToken);.    i
5bf0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5c00: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5c10: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
5c20: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5c30: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
5c40: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
5c50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5c60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
5c70: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
5c80: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
5c90: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ca0: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
5cb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5cc0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
5cd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5ce0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5cf0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
5d00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
5d10: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
5d20: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
5d30: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
5d40: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
5d50: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
5d60: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
5d70: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
5d80: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
5d90: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
5da0: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
5db0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5dc0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5dd0: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
5de0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5df0: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
5e00: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5e10: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
5e20: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
5e30: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
5e40: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
5e50: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5e60: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
5e70: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
5e80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5e90: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
5ea0: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
5eb0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
5ec0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
5ed0: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
5ee0: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
5ef0: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
5f00: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
5f10: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
5f20: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
5f30: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
5f40: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
5f50: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
5f60: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
5f70: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
5f80: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
5f90: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
5fa0: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
5fb0: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
5fc0: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
5fd0: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6020: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
6030: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
6040: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6050: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
6060: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
6070: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
6080: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
6090: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
60a0: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
60b0: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
60c0: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
60d0: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
60e0: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
60f0: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
6100: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
6110: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
6120: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
6130: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
6140: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
6150: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
6160: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
6170: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
6180: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
6190: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
61a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
61b0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
61c0: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
61d0: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
61e0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
61f0: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
6200: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
6210: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
6220: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
6230: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
6240: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
6250: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
6260: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
6270: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
6280: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
6290: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
62a0: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
62b0: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
62c0: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
62d0: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
62e0: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
62f0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
6300: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
6310: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
6320: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
6330: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
6340: 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65  of teh Expr obje
6350: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
6360: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
6370: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
6380: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
6390: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
63a0: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
63b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
63c0: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
63d0: 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55   an EXPRDUP_REDU
63e0: 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64  CE copy of a red
63f0: 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  uced expression.
6400: 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67    It is only leg
6410: 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20  al.** to reduce 
6420: 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65  a pristine expre
6430: 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20  ssion tree from 
6440: 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65  the parser.  The
6450: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
6460: 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53  ** of dupedExprS
6470: 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74  tructSize() cont
6480: 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73  ain multiple ass
6490: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
64a0: 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a   that attempt.**
64b0: 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
64c0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
64d0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
64e0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  ExprStructSize(E
64f0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
6500: 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  s){.  int nSize;
6510: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
6520: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
6530: 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20   || flags==0 ); 
6540: 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67  /* Only one flag
6550: 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a   value allowed *
6560: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52  /.  assert( EXPR
6570: 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66  _FULLSIZE<=0xfff
6580: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30   );.  assert( (0
6590: 78 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63  xfff & (EP_Reduc
65a0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
65b0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d  )==0 );.  if( 0=
65c0: 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  =(flags&EXPRDUP_
65d0: 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e  REDUCE) ){.    n
65e0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
65f0: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
6600: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6610: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6620: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
6630: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
6640: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
6650: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
6660: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
6670: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
6680: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
6690: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
66a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
66b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
66c0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
66d0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
66e0: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
66f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
6700: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
6710: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
6720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
6730: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
6740: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
6750: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
6760: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
6770: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
6780: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
6790: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
67a0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
67b0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
67c0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
67d0: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
67e0: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
67f0: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
6800: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
6810: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
6820: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
6830: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
6840: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6850: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
6860: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
6870: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
6880: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
6890: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
68a0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
68b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
68c0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
68d0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
68e0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
68f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
6900: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
6910: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
6920: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
6930: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6940: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
6950: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
6960: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
6970: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
6980: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
6990: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
69a0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
69b0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
69c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
69d0: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
69e0: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
69f0: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
6a00: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
6a10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
6a20: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
6a30: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
6a40: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
6a50: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
6a60: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
6a70: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
6a80: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
6a90: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
6aa0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
6ab0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
6ac0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
6ad0: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
6ae0: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
6af0: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
6b00: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
6b10: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
6b20: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
6b30: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
6b40: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
6b50: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
6b60: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
6b70: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
6b80: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
6b90: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
6ba0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
6bb0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
6bc0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
6bd0: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
6be0: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
6bf0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
6c00: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
6c10: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
6c20: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
6c30: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
6c40: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
6c50: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
6c60: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
6c70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
6c80: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
6c90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
6ca0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
6cb0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
6cc0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
6cd0: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
6ce0: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
6cf0: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
6d00: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
6d10: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
6d20: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
6d30: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
6d40: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
6d50: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
6d60: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
6d70: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
6d80: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
6d90: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
6da0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
6db0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
6dc0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
6dd0: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
6de0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
6df0: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
6e00: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
6e10: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
6e20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
6e30: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
6e40: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
6e50: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
6e60: 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  flags, u8 **pzBu
6e70: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
6e80: 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ea0: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
6eb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c   */.  assert( fl
6ec0: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
6ed0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
6ee0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
6ef0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6f00: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6f10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6f20: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6f30: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6f40: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6f50: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
6f60: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
6f70: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
6f80: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
6f90: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
6fa0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
6fb0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6fc0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6fd0: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6fe0: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6ff0: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
7000: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
7010: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
7020: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
7030: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
7040: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
7050: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
7060: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
7070: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
7080: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
7090: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
70a0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
70b0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
70c0: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
70d0: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
70e0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
70f0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
7100: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
7110: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
7120: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
7130: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
7140: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
7150: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
7160: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
7170: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
7180: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
7190: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
71a0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
71b0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
71c0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
71d0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
71e0: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
71f0: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
7200: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
7210: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
7220: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7230: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
7240: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
7250: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
7260: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7270: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
7280: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
7290: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
72a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
72b0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
72c0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
72d0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
72e0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
72f0: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
7300: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
7310: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
7320: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7330: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
7340: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
7350: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ize(p);.        
7360: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
7370: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
7380: 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52    if( nSize<EXPR
7390: 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20  _FULLSIZE ){ .  
73a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
73b0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
73c0: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
73d0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
73e0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
73f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
7400: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
7410: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
7420: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
7430: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
7440: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
7450: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
7460: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
7470: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
7480: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
7490: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
74a0: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
74b0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
74c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
74d0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
74e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  ;..      /* Copy
74f0: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
7500: 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e   string, if any.
7510: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54   */.      if( nT
7520: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
7530: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
7540: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
7550: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
7560: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
7570: 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c    memcpy(zToken,
7580: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54   p->u.zToken, nT
7590: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  oken);.      }..
75a0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70        if( 0==((p
75b0: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
75c0: 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  ags) & EP_TokenO
75d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
75e0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
75f0: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
7600: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
7610: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
7620: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
7630: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
7640: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
7650: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65       pNew->x.pSe
7660: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
7670: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  lectDup(db, p->x
7680: 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75  .pSelect, isRedu
7690: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ced);.        }e
76a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
76b0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
76c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
76d0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
76e0: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
76f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7700: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
7710: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
7720: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
7730: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
7740: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7750: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
7760: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
7770: 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d         zAlloc +=
7780: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
7790: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
77a0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
77b0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
77c0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
77d0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
77e0: 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64  Left = exprDup(d
77f0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
7800: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
7810: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
7820: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
7830: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7840: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
7850: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
7860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7870: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
7880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  ){.          *pz
7890: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
78a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
78b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
78c0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
78d0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
78e0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
78f0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
7900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7910: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
7920: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7930: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
7940: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7950: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
7960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7980: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7990: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
79a0: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
79b0: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
79c0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
79d0: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
79e0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
79f0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
7a00: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
7a10: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
7a20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7a30: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
7a40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7a50: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
7a60: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
7a70: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
7a80: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
7a90: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
7aa0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
7ab0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
7ac0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
7ad0: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
7ae0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
7af0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
7b00: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7b10: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
7b20: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
7b30: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
7b40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7b50: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
7b60: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
7b70: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
7b80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7b90: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
7ba0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
7bb0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
7bc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7bd0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
7be0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
7bf0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
7c00: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7c10: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
7c20: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
7c30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7c40: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
7c50: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
7c60: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
7c70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
7c80: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
7c90: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
7ca0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
7cb0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
7cc0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7cd0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7ce0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7cf0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7d00: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7d10: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7d20: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
7d30: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
7d40: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
7d50: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
7d60: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
7d70: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
7d80: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
7d90: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
7da0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
7db0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
7dc0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7dd0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7de0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7df0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7e00: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7e10: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7e20: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
7e30: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
7e40: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
7e50: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
7e60: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
7e70: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
7e80: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
7e90: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
7ea0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
7eb0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
7ec0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7ed0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7ee0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7ef0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7f00: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7f10: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7f20: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
7f30: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
7f40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
7f50: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
7f60: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
7f70: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
7f80: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7f90: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
7fa0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
7fb0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
7fc0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7fd0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
7fe0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
7ff0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
8000: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
8010: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
8020: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
8030: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
8040: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
8050: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
8060: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
8070: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
8080: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8090: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
80a0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
80b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
80c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
80d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
80e0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
80f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8100: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8110: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8120: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
8130: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
8140: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
8150: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
8160: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
8170: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
8180: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8190: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
81a0: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
81b0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
81c0: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
81d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
81e0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
81f0: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8200: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8210: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8220: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
8230: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
8240: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
8250: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
8260: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
8270: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
8280: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8290: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
82a0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
82b0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
82c0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
82d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
82e0: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
82f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8300: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8310: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8320: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
8330: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
8340: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
8350: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
8360: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
8370: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
8380: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8390: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
83a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
83b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
83c0: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
83d0: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
83e0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
83f0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8400: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8410: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8420: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
8430: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
8440: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
8450: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
8460: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
8470: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
8480: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8490: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
84a0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
84b0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
84c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
84d0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
84e0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
84f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8500: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8510: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8520: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
8530: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
8540: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
8550: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8560: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
8570: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
8580: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8590: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
85a0: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
85b0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
85c0: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
85d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
85e0: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
85f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8610: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8620: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
8630: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
8640: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
8650: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
8660: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8670: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8680: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8690: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
86a0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
86b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
86c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
86d0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
86e0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
86f0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8700: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8710: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8720: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
8730: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
8740: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8750: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8760: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
8770: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
8780: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8790: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
87a0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
87b0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
87c0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
87d0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
87e0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
87f0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
8800: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
8810: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
8820: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
8830: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
8840: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
8850: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
8860: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
8870: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
8880: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
8890: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
88a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
88b0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
88c0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
88d0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
88e0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
88f0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
8900: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
8910: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
8920: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
8930: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
8940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8950: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
8960: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
8970: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
8980: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
8990: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
89a0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
89b0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
89c0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
89d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
89e0: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
89f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8a00: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8a10: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
8a20: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
8a30: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
8a40: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8a50: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
8a60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
8a70: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
8a80: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
8a90: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
8aa0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
8ab0: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
8ac0: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
8ad0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
8ae0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
8af0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
8b00: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
8b10: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
8b20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
8b30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8b50: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8b60: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
8b70: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8b90: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
8ba0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
8bb0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8bc0: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
8bd0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
8be0: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
8bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
8c00: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
8c10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8c20: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
8c30: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
8c40: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
8c50: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
8c60: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
8c70: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
8c80: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
8c90: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
8ca0: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
8cb0: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
8cc0: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
8cd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
8ce0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
8cf0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
8d00: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
8d10: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
8d20: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
8d30: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
8d40: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
8d50: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
8d60: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
8d70: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8d80: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
8d90: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
8da0: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
8db0: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
8dc0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
8dd0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
8de0: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
8df0: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
8e00: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65  t flags){.  Sele
8e10: 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f  ct *pNew, *pPrio
8e20: 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  r;.  if( p==0 ) 
8e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8e40: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8e50: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8e60: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
8e70: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
8e80: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
8e90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8ea0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
8eb0: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
8ec0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
8ed0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
8ee0: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
8ef0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
8f00: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
8f10: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
8f20: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8f30: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
8f40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8f50: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
8f60: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8f70: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
8f80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8f90: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
8fa0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
8fb0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
8fc0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
8fd0: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
8fe0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
8ff0: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
9000: 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73  ior = pPrior = s
9010: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
9020: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66  db, p->pPrior, f
9030: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72  lags);.  if( pPr
9040: 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
9050: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
9060: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
9070: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
9080: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9090: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c  b, p->pLimit, fl
90a0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
90b0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
90c0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
90d0: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
90e0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
90f0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
9100: 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  et = 0;.  pNew->
9110: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
9120: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
9130: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e  sEphemeral;.  pN
9140: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
9150: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
9160: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
9170: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
9180: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e  nSelectRow = p->
9190: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e  nSelectRow;.  pN
91a0: 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68  ew->pWith = with
91b0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  Dup(db, p->pWith
91c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
91d0: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
91e0: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
91f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
9200: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
9210: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
9220: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
9230: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
9240: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
9250: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
9260: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9270: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
9280: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
9290: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
92a0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
92b0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
92c0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
92d0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
92e0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
92f0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9300: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
9310: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
9320: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
9330: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
9340: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
9350: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
9360: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
9370: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
9380: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
9390: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
93a0: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
93b0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
93c0: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
93d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
93e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
93f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9400: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
9410: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
9420: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
9430: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
9440: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
9450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
9460: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
9470: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
9480: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
9490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
94a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
94b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
94c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
94d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
94e0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
94f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
9500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
9510: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
9520: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
9530: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9540: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69  w(db, sizeof(pLi
9550: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
9560: 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20  if( pList->a==0 
9570: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
9580: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
9590: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
95a0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
95b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
95c0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
95d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
95e0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
95f0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
9600: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
9610: 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ->a, pList->nExp
9620: 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  r*2*sizeof(pList
9630: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
9640: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
9650: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
9660: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
9670: 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = a;.  }.  asser
9680: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
9690: 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20  ;.  if( 1 ){.   
96a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
96b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
96c0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
96d0: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
96e0: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
96f0: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
9700: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
9710: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
9720: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
9730: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
9740: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
9750: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
9760: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
9770: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9780: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
9790: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
97a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
97b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
97c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
97d0: 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74  sort order for t
97e0: 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
97f0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78 70  on the given Exp
9800: 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rList..*/.void s
9810: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
9820: 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c  tSortOrder(ExprL
9830: 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72  ist *p, int iSor
9840: 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70  tOrder){.  if( p
9850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9860: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53  assert( SQLITE_S
9870: 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26  O_UNDEFINED<0 &&
9880: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d   SQLITE_SO_ASC>=
9890: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44  0 && SQLITE_SO_D
98a0: 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ESC>0 );.  asser
98b0: 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  t( p->nExpr>0 );
98c0: 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65  .  if( iSortOrde
98d0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  r<0 ){.    asser
98e0: 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  t( p->a[p->nExpr
98f0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53  -1].sortOrder==S
9900: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a  QLITE_SO_ASC );.
9910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9920: 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d    p->a[p->nExpr-
9930: 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  1].sortOrder = (
9940: 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d  u8)iSortOrder;.}
9950: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9960: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61  ExprList.a[].zNa
9970: 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  me element of th
9980: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9990: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
99a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
99b0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
99c0: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
99d0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
99e0: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61   error.  But pNa
99f0: 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  me should never 
9a00: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
9a10: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
9a20: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
9a30: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9a40: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
9a50: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
9a60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
9a70: 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  etName(.  Parse 
9a80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9a90: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9aa0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9ab0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
9ac0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
9ad0: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
9ae0: 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  an. */.  Token *
9af0: 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
9b00: 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61   /* Name to be a
9b10: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  dded */.  int de
9b20: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
9b30: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75    /* True to cau
9b40: 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62  se the name to b
9b50: 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  e dequoted */.){
9b60: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9b70: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
9b80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
9b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
9ba0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
9bb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9bc0: 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
9bd0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
9be0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
9bf0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9c00: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9c10: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
9c20: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  ame==0 );.    pI
9c30: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
9c40: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50  ite3DbStrNDup(pP
9c50: 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d  arse->db, pName-
9c60: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
9c70: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
9c80: 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
9c90: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
9ca0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
9cb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
9cc0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
9cd0: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
9ce0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9cf0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
9d00: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
9d10: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9d20: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
9d30: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
9d40: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
9d50: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
9d60: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
9d70: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9d80: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
9d90: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
9da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
9db0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
9dc0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9dd0: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
9de0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9df0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9e00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9e10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9e20: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
9e30: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
9e40: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70  e span. */.  Exp
9e50: 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20  rSpan *pSpan    
9e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e       /* The span
9e70: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
9e80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9ea0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
9eb0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
9ec0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
9ed0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
9ee0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9ef0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
9f00: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9f10: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
9f20: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
9f30: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
9f40: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9f50: 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78  ed || pItem->pEx
9f60: 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72  pr==pSpan->pExpr
9f70: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
9f80: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
9f90: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
9fa0: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
9fb0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
9fc0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
9fd0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
a000: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
a010: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
a020: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
a030: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
a040: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
a050: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
a060: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
a070: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
a080: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
a090: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
a0a0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
a0b0: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
a0c0: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
a0d0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
a0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
a0f0: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
a100: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
a110: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
a120: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
a130: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
a140: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
a150: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
a160: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
a170: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
a180: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
a190: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
a1a0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
a1b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a1c0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
a1d0: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
a1e0: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
a1f0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
a200: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
a210: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
a220: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a230: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
a240: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
a250: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
a260: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a270: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
a280: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
a290: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
a2a0: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73  st->a!=0 || pLis
a2b0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20  t->nExpr==0 );. 
a2c0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
a2d0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
a2e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
a2f0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
a300: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a310: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
a320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
a330: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
a340: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
a350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a360: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
a370: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a380: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
a390: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a3a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
a3c0: 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c  itwise-OR of all
a3d0: 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
a3e0: 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a  ds in the given.
a3f0: 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  ** ExprList..*/.
a400: 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c  u32 sqlite3ExprL
a410: 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45  istFlags(const E
a420: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
a430: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20  .  int i;.  u32 
a440: 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  m = 0;.  if( pLi
a450: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
a460: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
a470: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
a480: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
a490: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
a4a0: 0a 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  .       if( ALWA
a4b0: 59 53 28 70 45 78 70 72 29 20 29 20 6d 20 7c 3d  YS(pExpr) ) m |=
a4c0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
a4d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a4e0: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
a4f0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
a500: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
a510: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
a520: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
a530: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
a540: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
a550: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
a560: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
a570: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
a580: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
a590: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
a5a0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
a5b0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
a5c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
a5d0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
a5e0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
a5f0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
a600: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
a610: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a620: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
a630: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a640: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
a650: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
a660: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
a670: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
a680: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
a690: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
a6a0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
a6c0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
a6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a6e0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
a6f0: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
a700: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
a710: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
a720: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
a730: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
a740: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
a750: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
a760: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
a770: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
a780: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
a790: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
a7a0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a7b0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
a7c0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
a7d0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
a7e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a7f0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
a800: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
a810: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
a820: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
a830: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
a840: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
a850: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
a860: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
a870: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
a880: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
a890: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
a8a0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
a8b0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
a8c0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
a8d0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
a8e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a8f0: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
a900: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
a910: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
a920: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
a930: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
a940: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
a950: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
a960: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
a970: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
a980: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
a990: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
a9a0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
a9b0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
a9c0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
a9d0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
a9e0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
a9f0: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
aa00: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
aa10: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
aa20: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
aa30: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
aa40: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
aa50: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
aa60: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
aa70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
aa80: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
aa90: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
aaa0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
aab0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
aac0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
aad0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
aae0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
aaf0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
ab00: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
ab10: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
ab20: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
ab30: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
ab40: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
ab50: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
ab60: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
ab70: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
ab80: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
ab90: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
aba0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
abb0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
abc0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
abd0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
abe0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
abf0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
ac00: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ac10: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
ac20: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
ac30: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
ac40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ac50: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
ac60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ac70: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
ac80: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
ac90: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
aca0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
acb0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
acc0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
acd0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ace0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
acf0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
ad00: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ad10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
ad20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ad30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
ad40: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
ad50: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
ad60: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
ad70: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
ad80: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ad90: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
ada0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
adb0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
adc0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
add0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
ade0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
adf0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
ae00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae10: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ae20: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
ae30: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ae40: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
ae50: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
ae60: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
ae70: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
ae90: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
aea0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
aeb0: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
aec0: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
aed0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
aee0: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
aef0: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
af00: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
af10: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
af20: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
af30: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
af40: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
af50: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
af60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
af70: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
af80: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
af90: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
afa0: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
afb0: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
afc0: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
afd0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
afe0: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
aff0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
b000: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
b010: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
b020: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
b040: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
b050: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
b060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
b070: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b080: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
b090: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
b0a0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
b0b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b0c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
b0d0: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
b0e0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
b0f0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
b100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
b110: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
b120: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
b130: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
b140: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
b150: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
b160: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
b170: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
b180: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
b190: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
b1a0: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
b1b0: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
b1c0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
b1d0: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
b1e0: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
b1f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
b200: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
b210: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
b220: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
b230: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
b240: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
b250: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
b260: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
b270: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
b280: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
b290: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
b2a0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
b2b0: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
b2c0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b2d0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b2e0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b2f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b300: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
b310: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
b320: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
b330: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
b340: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
b350: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
b360: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
b370: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b380: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
b390: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
b3a0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
b3b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
b3c0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
b3d0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
b3e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b3f0: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
b400: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
b410: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
b420: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
b430: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b440: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b450: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b460: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b470: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
b480: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
b490: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
b4a0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
b4b0: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
b4c0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
b4d0: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
b4e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
b4f0: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
b500: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
b510: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
b520: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b530: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
b540: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
b550: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
b560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
b570: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
b580: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
b590: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
b5a0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
b5b0: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
b5c0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
b5d0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
b5e0: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
b5f0: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
b600: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
b610: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
b620: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
b630: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
b640: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
b650: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
b660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b670: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
b680: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
b690: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
b6a0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
b6b0: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
b6c0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b6d0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b6e0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b6f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b700: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
b710: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
b720: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
b730: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
b740: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
b750: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
b760: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
b770: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
b780: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
b790: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
b7a0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
b7b0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b7c0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
b7d0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
b7e0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
b7f0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
b800: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
b810: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
b820: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
b830: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
b840: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
b850: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
b860: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
b870: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
b880: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
b890: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b8a0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
b8b0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
b8c0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
b8d0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
b8e0: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b8f0: 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
b900: 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
b910: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
b920: 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
b930: 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
b940: 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
b950: 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
b960: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
b970: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
b980: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
b990: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
b9a0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
b9b0: 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
b9c0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
b9d0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
b9e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
b9f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
ba00: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ba10: 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
ba20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
ba30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ba40: 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
ba50: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
ba60: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
ba70: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
ba80: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
ba90: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
baa0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
bab0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
bac0: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
bad0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
bae0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
baf0: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
bb00: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
bb10: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
bb20: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
bb30: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
bb40: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
bb50: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
bb60: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
bb70: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
bb80: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
bb90: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
bba0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
bbb0: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
bbc0: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
bbd0: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
bbe0: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
bbf0: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
bc00: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
bc10: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
bc20: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
bc30: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
bc40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
bc50: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
bc60: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
bc70: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
bc80: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
bc90: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
bca0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
bcb0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
bcc0: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
bcd0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
bce0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
bcf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
bd00: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
bd10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
bd20: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
bd30: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
bd40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bd50: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
bd60: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
bd70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
bd80: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
bd90: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
bda0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
bdb0: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
bdc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
bdd0: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
bde0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
bdf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
be00: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
be10: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
be20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
be30: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
be40: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
be50: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
be60: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
be70: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
be80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
be90: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
bea0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
beb0: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
bec0: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
bed0: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
bee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bef0: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
bf00: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
bf10: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
bf20: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
bf30: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
bf40: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
bf50: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
bf60: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
bf70: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
bf80: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
bf90: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
bfa0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
bfb0: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
bfc0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
bfd0: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
bfe0: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
bff0: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
c000: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
c010: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
c020: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
c030: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
c040: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
c050: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
c060: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
c070: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
c080: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
c090: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
c0a0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
c0b0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
c0c0: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
c0d0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
c0e0: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
c0f0: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
c100: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
c110: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
c120: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
c130: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
c140: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
c150: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
c160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
c170: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
c180: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
c190: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
c1a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
c1b0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
c1c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c1d0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
c1e0: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
c1f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
c200: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
c210: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
c220: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
c230: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
c240: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
c250: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
c260: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c270: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
c280: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
c290: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
c2a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
c2b0: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
c2c0: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
c2d0: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
c2e0: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
c2f0: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
c300: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
c310: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c320: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c330: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
c340: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
c350: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
c360: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
c370: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
c380: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
c390: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
c3a0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
c3b0: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
c3c0: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
c3d0: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
c3e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
c3f0: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
c400: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
c410: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
c420: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
c430: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
c440: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
c450: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
c460: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
c470: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
c480: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
c490: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
c4a0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
c4b0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
c4c0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
c4d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c4e0: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
c500: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c510: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
c520: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
c530: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c540: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
c550: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
c560: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
c570: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
c580: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
c590: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
c5a0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
c5b0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c5c0: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
c5d0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
c5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
c5f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c600: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c610: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
c620: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
c630: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
c640: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
c650: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
c660: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
c670: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
c680: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c690: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
c6a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c6b0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
c6c0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
c6d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
c6e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
c6f0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
c700: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
c710: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
c720: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
c730: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
c740: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
c750: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
c760: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
c770: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
c780: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c790: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
c7a0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
c7b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c7c0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
c7d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
c7e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c7f0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
c800: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74  we are able to t
c810: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f  he IN operator o
c820: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61  ptimization on a
c830: 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
c840: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
c850: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
c860: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  ..).**.** Where 
c870: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c  the SELECT... cl
c880: 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69  ause is as speci
c890: 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61  fied by the para
c8a0: 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a  meter to this.**
c8b0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
c8c0: 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  The Select objec
c8d0: 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20  t passed in has 
c8e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
c8f0: 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f  processed and no
c900: 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20  .** errors have 
c910: 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23  been found..*/.#
c920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c930: 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
c940: 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61  ic int isCandida
c950: 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63  teForInOpt(Selec
c960: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
c970: 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
c980: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
c990: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
c9a0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e      /* right-han
c9d0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20  d side of IN is 
c9e0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
c9f0: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
ca00: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
ca10: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
ca20: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
ca30: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
ca40: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
ca50: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
ca60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
ca70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
ca80: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
ca90: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
caa0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
cab0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
cac0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
cad0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
cae0: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
caf0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
cb00: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
cb10: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
cb20: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
cb30: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
cb40: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
cb50: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
cb60: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
cb70: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
cb80: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
cb90: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
cba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
cbb0: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
cbc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
cbd0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbf0: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
cc00: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
cc10: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
cc20: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
cc30: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
cc40: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
cc50: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
cc60: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
cc70: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
cc80: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
cc90: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
cca0: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
ccb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
ccc0: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
ccd0: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
cce0: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
ccf0: 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
cd00: 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
cd10: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
cd20: 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45  ].pTab;.  if( NE
cd30: 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72  VER(pTab==0) ) r
cd40: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
cd50: 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
cd60: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
cd70: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
cd80: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
cd90: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
cda0: 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
cdb0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
cdc0: 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
cdd0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
cde0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
cdf0: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
ce00: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
ce10: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ce20: 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e  /* One column in
ce30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ce40: 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  */.  if( pEList-
ce50: 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
ce60: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
ce70: 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74  urn 0; /* Result
ce80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   is a column */.
ce90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
cea0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ceb0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
cec0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
ced0: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
cee0: 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  on and allocate 
cef0: 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c  space for its fl
cf00: 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a  ag. Return the .
cf10: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
cf20: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
cf30: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
cf40: 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20  3CodeOnce(Parse 
cf50: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
cf60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
cf70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
cf80: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
cf90: 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
cfa0: 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  d */.  return sq
cfb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
cfc0: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72  v, OP_Once, pPar
cfd0: 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a  se->nOnce++);.}.
cfe0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
cff0: 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
d000: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
d010: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
d020: 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
d030: 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
d040: 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
d050: 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
d060: 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
d070: 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
d080: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
d090: 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
d0a0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
d0b0: 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
d0c0: 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
d0d0: 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
d0e0: 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
d0f0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
d100: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
d110: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
d120: 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
d130: 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
d140: 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
d150: 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
d160: 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
d170: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
d180: 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
d190: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
d1a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d1b0: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
d1c0: 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
d1d0: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
d1e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d1f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
d200: 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
d210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d220: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
d230: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
d240: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
d250: 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
d260: 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
d270: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d280: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 0a  e(v, addr1);.}..
d290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d2a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
d2b0: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
d2c0: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
d2d0: 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
d2e0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
d2f0: 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
d300: 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
d310: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
d320: 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
d330: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d340: 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
d350: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
d360: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
d370: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
d380: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
d390: 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
d3a0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
d3b0: 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
d3c0: 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
d3d0: 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
d3e0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d3f0: 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
d400: 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
d410: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
d420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
d430: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
d440: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
d450: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
d460: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
d470: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
d480: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
d490: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
d4a0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d4b0: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
d4c0: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
d4d0: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
d4e0: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
d4f0: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
d500: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
d510: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
d520: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
d530: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
d540: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
d550: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
d560: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
d570: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
d580: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
d590: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
d5a0: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
d5b0: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
d5c0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
d5d0: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
d5e0: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
d5f0: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
d600: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d610: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
d620: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
d630: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
d640: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
d650: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
d660: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
d670: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
d680: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
d690: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
d6a0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
d6b0: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
d6c0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
d6d0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
d6e0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
d6f0: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
d700: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
d710: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
d720: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
d730: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d740: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
d750: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d760: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
d770: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
d780: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
d790: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
d7a0: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
d7b0: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
d7c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d7d0: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
d7e0: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
d7f0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
d800: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
d810: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
d820: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
d830: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
d840: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
d860: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
d870: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
d880: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
d890: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
d8a0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
d8b0: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
d8c0: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
d8d0: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
d8e0: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
d8f0: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
d900: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
d910: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
d920: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d930: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
d940: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
d950: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
d960: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
d970: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
d980: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
d990: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
d9a0: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
d9b0: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
d9c0: 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
d9d0: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
d9e0: 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
d9f0: 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
da00: 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
da10: 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
da20: 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f  in exactly one o
da30: 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
da40: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
da50: 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
da60: 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  OP.  If inFlags 
da70: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
da80: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
da90: 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
daa0: 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
dab0: 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20  e used for a.** 
dac0: 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20  fast membership 
dad0: 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
dae0: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
daf0: 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a  t is set, the.**
db00: 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62   IN index will b
db10: 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
db20: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
db30: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
db40: 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  .** IN operator.
db50: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
db60: 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
db70: 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
db80: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
db90: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
dba0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
dbb0: 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
dbc0: 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
dbd0: 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
dbe0: 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
dbf0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
dc00: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
dc10: 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d   selected <colum
dc20: 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  n> is guaranteed
dc30: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
dc40: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
dc50: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
dc60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
dc70: 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e  r it.** has a UN
dc80: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
dc90: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e  or UNIQUE index.
dca0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
dcb0: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
dcc0: 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
dcd0: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
dce0: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
dcf0: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
dd00: 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
dd10: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
dd20: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
dd30: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
dd40: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
dd50: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
dd60: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
dd70: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
dd80: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
dd90: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
dda0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49  *.** If the IN_I
ddb0: 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64  NDEX_NOOP_OK and
ddc0: 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
ddd0: 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65  SHIP are both se
dde0: 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20  t and.** if the 
ddf0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
de00: 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
de10: 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
de20: 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  ) then this.** r
de30: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63  outine might dec
de40: 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e  ide that creatin
de50: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62  g an ephemeral b
de60: 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72  -tree for member
de70: 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ship.** testing 
de80: 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65  is too expensive
de90: 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49   and return IN_I
dea0: 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74  NDEX_NOOP.  In t
deb0: 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a  hat case, the.**
dec0: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
ded0: 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e   should implemen
dee0: 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  t the IN operato
def0: 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e  r using a sequen
df00: 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e  ce.** of Eq or N
df10: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
df20: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57  rations..**.** W
df30: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69  hen the b-tree i
df40: 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  s being used for
df50: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
df60: 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  s, the calling f
df70: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74  unction.** might
df80: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68   need to know wh
df90: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
dfa0: 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65   RHS side of the
dfb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
dfc0: 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e  contains a NULL.
dfd0: 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c    If prRhsHasNul
dfe0: 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20  l is not a NULL 
dff0: 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20  pointer and .** 
e000: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
e010: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
e020: 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
e030: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
e040: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
e050: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
e060: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
e070: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
e080: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
e090: 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  to *prRhsHasNull
e0a0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
e0b0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
e0c0: 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20   (...) contains 
e0d0: 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  a.** NULL value,
e0e0: 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e   then *prRhsHasN
e0f0: 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68  ull is left unch
e100: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
e110: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
e120: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
e130: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
e140: 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  in *prRhsHasNull
e150: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61  , then.** the va
e160: 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69  lue in that regi
e170: 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ster will be NUL
e180: 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  L if the b-tree 
e190: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
e1a0: 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  more.** NULL val
e1b0: 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c  ues, and it will
e1c0: 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c   be some non-NUL
e1d0: 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62  L value if the b
e1e0: 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e  -tree contains n
e1f0: 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  o.** NULL values
e200: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e210: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e220: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
e230: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
e240: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
e250: 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69  , u32 inFlags, i
e260: 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
e270: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
e2a0: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
e2b0: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
e2c0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
e2d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e2f0: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
e300: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
e310: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
e320: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
e330: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
e340: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
e350: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
e360: 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e380: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
e390: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
e3a0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
e3b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e3c0: 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
e3d0: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
e3e0: 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
e3f0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
e400: 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
e410: 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
e420: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
e430: 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  =0;..  /* Check 
e440: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
e450: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
e460: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
e470: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
e480: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
e490: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
e4a0: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
e4b0: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
e4c0: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
e4d0: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
e4e0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
e4f0: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
e500: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
e510: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e520: 72 3d 3d 30 20 26 26 20 69 73 43 61 6e 64 69 64  r==0 && isCandid
e530: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
e540: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
e550: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e570: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
e580: 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
e590: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
e5c0: 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  e>. */.    Expr 
e5d0: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
e600: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
e610: 69 31 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  i16 iCol;       
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
e640: 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d  of column <colum
e650: 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44  n> */.    i16 iD
e660: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
e690: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20   for pTab */..  
e6a0: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20    assert( p );  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
e6d0: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e6e0: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e700: 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
e710: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
e720: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e730: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e740: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e750: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
e760: 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
e770: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e780: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e790: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
e7a0: 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
e7b0: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
e7c0: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e7d0: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e7e0: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
e7f0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
e800: 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
e810: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
e820: 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29      iCol = (i16)
e830: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
e840: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
e850: 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
e860: 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
e870: 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
e880: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
e890: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
e8a0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
e8b0: 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
e8c0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
e8d0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
e8e0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
e8f0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
e900: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
e910: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
e920: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
e930: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
e940: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
e950: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
e960: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
e970: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
e980: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
e990: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
e9a0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
e9b0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
e9c0: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
e9d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
e9e0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
e9f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41   ){.      int iA
ea00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
ea10: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
ea20: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
ea30: 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
ea40: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
ea50: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
ea60: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
ea70: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
ea80: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
ea90: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
eaa0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
eab0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
eac0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
ead0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eaf0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
eb00: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
eb10: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
eb20: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
eb30: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
eb40: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
eb50: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
eb60: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
eb70: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
eb80: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
eb90: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
eba0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
ebb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
ebc0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
ebd0: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
ebe0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
ebf0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
ec00: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
ec10: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
ec20: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
ec30: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
ec40: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
ec50: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
ec60: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
ec70: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
ec80: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
ec90: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
eca0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
ecb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
ecc0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
ecd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ece0: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
ecf0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
ed00: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
ed10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
ed20: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
ed30: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ed40: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
ed50: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
ed60: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
ed70: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
ed80: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
ed90: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
eda0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
edb0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
edc0: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
edd0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
ede0: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
edf0: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
ee00: 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  || (pIdx->nKeyCo
ee10: 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65  l==1 && IsUnique
ee20: 49 6e 64 65 78 28 70 49 64 78 29 29 29 0a 20 20  Index(pIdx))).  
ee30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
ee40: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
ee50: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
ee60: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
ee70: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
ee80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ee90: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
eea0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
eeb0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
eec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
eed0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
eee0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
eef0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
ef00: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
ef10: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
ef20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
ef30: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
ef40: 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
ef50: 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
ef60: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
ef70: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
ef80: 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
ef90: 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20  Order[0];..     
efa0: 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
efb0: 73 4e 75 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e  sNull && !pTab->
efc0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
efd0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
efe0: 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
eff0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f000: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
f010: 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
f020: 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
f030: 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
f040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f060: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
f070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
f090: 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
f0a0: 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
f0b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
f0c0: 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
f0d0: 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
f0e0: 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
f0f0: 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
f100: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
f110: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
f120: 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
f130: 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
f140: 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   RHS is not cont
f150: 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
f160: 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
f170: 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
f180: 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
f190: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
f1a0: 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
f1b0: 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
f1c0: 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
f1d0: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
f1e0: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
f1f0: 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
f200: 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
f210: 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
f220: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
f230: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
f240: 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
f250: 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
f260: 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
f270: 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
f280: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
f290: 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
f2a0: 20 20 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79       ..  if( eTy
f2b0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
f2c0: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
f2d0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
f2e0: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
f2f0: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
f300: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
f310: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
f320: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
f330: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
f340: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
f350: 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
f360: 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
f370: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
f380: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
f390: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
f3a0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
f3b0: 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
f3c0: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
f3d0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
f3e0: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
f3f0: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
f400: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
f410: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
f420: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
f430: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
f440: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
f450: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
f460: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
f470: 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
f480: 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
f490: 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  l = rMayHaveNull
f4a0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f4b0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
f4c0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
f4d0: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
f4e0: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
f4f0: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
f500: 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  D);.    pParse->
f510: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
f520: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
f530: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
f540: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
f550: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
f560: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f570: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f580: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
f590: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
f5a0: 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
f5b0: 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
f5c0: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
f5d0: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
f5e0: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
f5f0: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
f600: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
f610: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
f620: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
f630: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
f640: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
f650: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
f660: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
f670: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
f680: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
f690: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
f6a0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
f6b0: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
f6c0: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
f6d0: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
f6e0: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
f6f0: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
f700: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
f710: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
f720: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
f730: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
f740: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
f750: 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
f760: 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
f770: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
f780: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
f790: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
f7a0: 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
f7b0: 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
f7c0: 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
f7d0: 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
f7e0: 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
f7f0: 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
f800: 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
f810: 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
f820: 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
f830: 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
f840: 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
f850: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
f860: 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
f870: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
f880: 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
f890: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
f8a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
f8b0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
f8c0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
f8d0: 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
f8e0: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
f8f0: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
f900: 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
f910: 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74   NULLs..** All t
f920: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
f930: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   is initialize t
f940: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
f950: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
f960: 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  l.** to NULL.  C
f970: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
f980: 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f  will take care o
f990: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
f9a0: 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75  register.** valu
f9b0: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
f9c0: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
f9d0: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  -free..**.** For
f9e0: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
f9f0: 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
fa00: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
fa10: 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
fa20: 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
fa30: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
fa40: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
fa50: 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  urs, the return 
fa60: 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23  value is 0..*/.#
fa70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fa80: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
fa90: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
faa0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
fab0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
fac0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
fad0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
fae0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
faf0: 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
fb00: 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
fb10: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
fb20: 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
fb30: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
fb40: 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
fb50: 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
fb60: 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
fb70: 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
fb80: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
fb90: 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
fba0: 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
fbb0: 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
fbc0: 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
fbf0: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
fc00: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
fc30: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
fc40: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
fc50: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
fc60: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
fc70: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
fc80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
fc90: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
fca0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
fcb0: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
fcc0: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
fcd0: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
fce0: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
fcf0: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
fd00: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
fd10: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
fd20: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
fd30: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
fd40: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
fd50: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
fd60: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
fd70: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
fd80: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
fd90: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
fda0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
fdb0: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
fdc0: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
fdd0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
fde0: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
fdf0: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
fe00: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
fe10: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
fe20: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
fe30: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
fe40: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
fe50: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
fe60: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
fe70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
fe80: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
fe90: 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69  .    jmpIfDynami
fea0: 63 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  c = sqlite3CodeO
feb0: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
fec0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fed0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fee0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
fef0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
ff00: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
ff10: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
ff20: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
ff30: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
ff40: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
ff50: 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66  ",.        jmpIf
ff60: 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43  Dynamic>=0?"":"C
ff70: 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20  ORRELATED ",.   
ff80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
ff90: 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43  TK_IN?"LIST":"SC
ffa0: 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70  ALAR",.        p
ffb0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
ffc0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
ffd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ffe0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
fff0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
10000 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
10010 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
10020 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
10030 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
10040 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
10050 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
10060 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
10070 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
10080 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
10090 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
100a0 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
100b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
100c0 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
100d0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
100e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
100f0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
10100 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
10110 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
10120 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
10130 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
10140 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
10150 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
10160 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69  */..      affini
10170 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
10180 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
10190 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
101a0 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
101b0 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
101c0 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
101d0 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
101e0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
101f0 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
10200 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
10210 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
10220 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
10230 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
10240 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
10250 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
10260 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
10270 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
10280 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
10290 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
102a0 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
102b0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
102c0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
102d0 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
102e0 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
102f0 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
10300 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
10310 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
10320 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
10330 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
10340 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
10350 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
10360 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
10370 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
10380 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
10390 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
103a0 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
103b0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
103c0 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
103d0 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
103e0 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
103f0 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
10400 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
10410 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
10420 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
10430 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
10440 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
10450 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
10460 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
10470 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
10480 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
10490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
104a0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
104b0 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
104c0 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
104d0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
104e0 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
104f0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10500 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
10510 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69   1, 1);..      i
10520 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10530 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
10540 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
10550 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
10560 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
10570 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
10580 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
10590 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
105a0 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
105b0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
105c0 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
105d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
105e0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
105f0 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
10600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10610 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10620 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
10630 65 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ect;.        Sel
10640 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
10650 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10660 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
10670 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
10680 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
10690 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
106a0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
106b0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
106c0 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  );.        dest.
106d0 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66  affSdst = (u8)af
106e0 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
106f0 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
10700 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
10710 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
10720 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  e );.        pSe
10730 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
10740 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
10750 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  se( pSelect->sel
10760 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
10770 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  nct );.        t
10780 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
10790 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
107a0 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
107b0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
107c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ) */.        if(
107d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
107e0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
107f0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
10800 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
10810 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
10820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10830 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
10840 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
10850 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
10860 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
10870 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
10880 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
10890 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
108a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
108b0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
108c0 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
108d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
108e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
108f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10900 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
10910 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
10920 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
10930 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
10940 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
10950 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
10960 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
10970 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
109c0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
109d0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
109e0 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
109f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
10a00 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
10a10 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
10a20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
10a30 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
10a40 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
10a50 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
10a60 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
10a70 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
10a80 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
10a90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
10aa0 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
10ab0 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
10ac0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
10ad0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
10ae0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
10af0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
10b00 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
10b10 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
10b20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
10b30 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
10b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
10b50 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
10b60 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
10b70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
10b80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10b90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
10ba0 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
10bb0 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
10bc0 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
10bd0 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
10be0 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
10bf0 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
10c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
10c10 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
10c20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10c30 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10c40 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
10c50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
10c60 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
10c70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
10c80 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
10c90 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
10ca0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
10cb0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
10cc0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
10cd0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
10ce0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
10cf0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10d00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
10d10 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
10d20 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10d30 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
10d40 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62  wid ) sqlite3Vdb
10d50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
10d60 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
10d70 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
10d80 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
10d90 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
10da0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
10db0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
10dc0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
10dd0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56            int iV
10de0 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
10df0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
10e00 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
10e10 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
10e20 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
10e30 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
10e40 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
10e50 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
10e60 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
10e70 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
10e80 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
10e90 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
10ea0 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
10eb0 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
10ec0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
10ed0 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
10ee0 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
10ef0 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
10f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
10f10 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
10f20 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  c>=0 && !sqlite3
10f30 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
10f40 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
10f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10f60 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d  angeToNoop(v, jm
10f70 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20  pIfDynamic);.   
10f80 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79           jmpIfDy
10f90 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20  namic = -1;.    
10fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
10fb0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
10fc0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
10fd0 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
10fe0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
10ff0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
11000 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
11010 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11020 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
11030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11050 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
11060 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
11070 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
11080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
11090 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
110a0 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
110b0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
110c0 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
110d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
110e0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
110f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11100 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
11110 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
11140 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11150 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
11160 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
11170 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
11180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11190 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
111a0 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
111b0 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a  Table, r2, r3);.
111c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
111d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
111e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
111f0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
11200 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
11210 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
11230 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
11240 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
11250 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  se, r3, 1);.    
11260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11270 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11280 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
11290 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
112a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
112b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
112c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
112d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
112e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
112f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11300 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11310 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
11320 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
11330 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
11340 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11350 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
11360 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
11370 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
11380 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11390 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
113a0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
113b0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
113c0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
113d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
113e0 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
113f0 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
11400 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
11410 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
11420 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
11430 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
11440 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
11450 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
11460 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
11470 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
11480 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
11490 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a  n EXISTS, write.
114a0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65        ** an inte
114b0 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
114c0 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
114d0 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
114e0 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ell.      ** and
114f0 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d   record that mem
11500 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
11510 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
11520 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
11530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
11550 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
11560 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
11570 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
11580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11590 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
115a0 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
115b0 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  t result */..   
115c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
115d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
115e0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
115f0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
11600 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
11610 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
11620 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
11630 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
11640 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20  _SELECT );..    
11650 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
11660 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11670 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11680 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
11690 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
116a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
116b0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
116c0 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
116d0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
116e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
116f0 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
11700 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
11710 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
11720 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73  dest.iSdst = des
11730 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
11740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11750 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
11760 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
11770 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
11780 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
11790 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
117a0 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
117b0 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
117c0 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
117d0 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
117e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
117f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
11800 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
11810 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11820 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
11830 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
11840 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11850 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
11860 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e  arse->db, pSel->
11870 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
11880 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
11890 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
118a0 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
118b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
118e0 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20  ntTokens[1]);.  
118f0 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74      pSel->iLimit
11900 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
11910 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
11920 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20  F_MultiValue;.  
11930 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11940 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11950 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
11960 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
11980 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  eg = dest.iSDPar
11990 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  m;.      ExprSet
119a0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
119b0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
119c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
119d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
119e0 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20  HasNullFlag ){. 
119f0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
11a00 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70  NullFlag(v, pExp
11a10 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e  r->iTable, rHasN
11a20 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20  ullFlag);.  }.. 
11a30 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
11a40 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c>=0 ){.    sqli
11a50 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11a60 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
11a70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
11a80 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
11a90 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  se);..  return r
11aa0 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
11ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11ac0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
11ad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
11ae0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
11af0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
11b00 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
11b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
11b20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
11b30 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
11b40 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
11b50 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
11b60 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
11b70 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
11b80 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74  sion.  The right
11b90 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
11ba0 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20  .** is an array 
11bb0 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
11bc0 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70  values.  The exp
11bd0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
11be0 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a  if the LHS is.**
11bf0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
11c00 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
11c10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
11c20 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f  ression is unkno
11c30 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20  wn (NULL).** if 
11c40 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20  the LHS is NULL 
11c50 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  or if the LHS is
11c60 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77   not contained w
11c70 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e  ithin the RHS an
11c80 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e  d the.** RHS con
11c90 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
11ca0 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
11cb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11cc0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
11cd0 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64   that jumps to d
11ce0 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
11cf0 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
11d00 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
11d10 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
11d20 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
11d30 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
11d40 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
11d50 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
11d60 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
11d70 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
11d80 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
11d90 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
11da0 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
11db0 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
11dc0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
11dd0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
11de0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11df0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11e00 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
11e10 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
11e20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
11e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e40 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
11e50 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
11e60 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
11e70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
11e80 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
11e90 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
11ea0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
11eb0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11ec0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
11ed0 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
11ee0 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
11ef0 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
11f00 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
11f10 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
11f20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
11f30 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
11f40 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
11f50 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
11f60 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f  ison affinity to
11f70 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54   use */.  int eT
11f80 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
11f90 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
11fa0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20  HS */.  int r1; 
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11fc0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
11fd0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62  egister */.  Vdb
11fe0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
11ff0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
12000 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12010 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  on */..  /* Comp
12020 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41  ute the RHS.   A
12030 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
12040 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
12050 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72  ursor.  ** pExpr
12060 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f  ->iTable will co
12070 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
12080 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
12090 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76  he RHS..  */.  v
120a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
120b0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
120c0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
120d0 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
120e0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
120f0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
12100 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
12110 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
12120 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
12130 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
12140 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20   pExpr,.        
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45       IN_INDEX_ME
12170 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e  MBERSHIP | IN_IN
12180 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20  DEX_NOOP_OK,.   
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66            destIf
121b0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
121c0 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73  l ? 0 : &rRhsHas
121d0 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  Null);..  /* Fig
121e0 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
121f0 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
12200 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
12210 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
12220 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
12230 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
12240 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
12250 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
12260 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20   for.  ** P4 of 
12270 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
12280 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d   */.  affinity =
12290 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
122a0 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f  ity(pExpr);..  /
122b0 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
122c0 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
122d0 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
122e0 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  "..  */.  sqlite
122f0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
12300 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73  Parse);.  r1 = s
12310 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12320 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
12330 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
12340 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12350 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , r1);..  /* If 
12360 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
12370 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
12380 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
12390 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
123a0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
123b0 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
123c0 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
123d0 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
123e0 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
123f0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
12400 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
12410 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29  =IN_INDEX_NOOP )
12420 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
12430 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
12440 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c  .pList;.    Coll
12450 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
12460 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
12470 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12480 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c  Left);.    int l
12490 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33  abelOk = sqlite3
124a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
124b0 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65  ;.    int r2, re
124c0 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74  gToFree;.    int
124d0 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a   regCkNull = 0;.
124e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
124f0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
12500 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
12510 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
12520 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e  .    if( destIfN
12530 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
12540 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e   ){.      regCkN
12550 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ull = sqlite3Get
12560 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12580 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
12590 69 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72  itAnd, r1, r1, r
125a0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  egCkNull);.    }
125b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
125c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
125d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20  ii++){.      r2 
125e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
125f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
12600 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
12610 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  , &regToFree);. 
12620 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75       if( regCkNu
12630 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ll && sqlite3Exp
12640 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74  rCanBeNull(pList
12650 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
12660 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12670 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12680 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e  P_BitAnd, regCkN
12690 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75  ull, r2, regCkNu
126a0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
126b0 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d     if( ii<pList-
126c0 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74  >nExpr-1 || dest
126d0 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
126e0 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lse ){.        s
126f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12700 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c  (v, OP_Eq, r1, l
12710 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20  abelOk, r2,.    
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
12740 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
12750 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
12760 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c  erageIf(v, ii<pL
12770 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
12780 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
12790 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69  ageIf(v, ii==pLi
127a0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
127b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
127c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66  eChangeP5(v, aff
127d0 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 7d 65  inity);.      }e
127e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
127f0 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
12800 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
12810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12820 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12830 4e 65 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  Ne, r1, destIfFa
12840 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
12870 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
12880 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
128a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66  beChangeP5(v, af
128b0 66 69 6e 69 74 79 20 7c 20 53 51 4c 49 54 45 5f  finity | SQLITE_
128c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
128d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
128e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
128f0 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72  (pParse, regToFr
12900 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
12910 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a  f( regCkNull ){.
12920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
12940 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  Null, regCkNull,
12950 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
12960 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12980 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
12990 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lse);.    }.    
129a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
129b0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
129c0 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ok);.    sqlite3
129d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
129e0 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c  Parse, regCkNull
129f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
12a00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53     /* If the LHS
12a10 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
12a20 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
12a30 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
12a40 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20  L depending.    
12a50 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ** on whether th
12a60 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f  e RHS is empty o
12a70 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
12a80 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ely..    */.    
12a90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
12aa0 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e  anBeNull(pExpr->
12ab0 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
12ac0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
12ad0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
12ae0 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 63         /* Shortc
12af0 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ut for the commo
12b00 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
12b10 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20   false and NULL 
12b20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20  outcomes are.   
12b30 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
12b40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
12b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12b60 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
12b70 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
12b80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12b90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12ba0 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
12bb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12bc0 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
12bd0 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   r1); VdbeCovera
12be0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
12bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12c00 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
12c10 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
12c20 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
12c30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12c40 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
12c50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
12c60 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
12c70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12c80 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12c90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
12ca0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54 79  }.  .    if( eTy
12cb0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
12cc0 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ID ){.      /* I
12cd0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
12ce0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
12cf0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
12d00 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
12d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d20 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
12d30 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  nt, r1, destIfFa
12d40 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  lse); VdbeCovera
12d50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
12d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12d70 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
12d80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
12d90 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
12da0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
12db0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
12dc0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
12dd0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
12de0 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
12df0 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tree..      */. 
12e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
12e20 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c  inity, r1, 1, 0,
12e30 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
12e40 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
12e50 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
12e60 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
12e70 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12e80 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22   the .      ** "
12e90 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
12ea0 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
12eb0 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
12ec0 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
12ed0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
12ee0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12ef0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12f00 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
12f10 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
12f20 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12f30 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
12f40 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12f50 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
12f60 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
12f70 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  LL..      */.   
12f80 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
12f90 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75  fFalse!=destIfNu
12fa0 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c  ll || rRhsHasNul
12fb0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  l==0 );.      if
12fc0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
12fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
12fe0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
12ff0 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61  if it is known a
13000 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74  t compile time t
13010 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20  hat the RHS.    
13020 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f      ** cannot co
13030 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65  ntain NULL value
13040 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
13050 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
13060 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
13070 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
13080 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
13090 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
130a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
130b0 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
130c0 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
130d0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
130e0 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a  FALSE.        **
130f0 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
13100 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
13110 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13130 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
13140 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
13150 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
13160 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20  alse, r1, 1);.  
13170 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
13180 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
13190 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
131a0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74  n this branch, t
131b0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
131c0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
131d0 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20   NULL and.      
131e0 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
131f0 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
13200 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
13210 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
13220 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  .        ** outc
13230 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ome..        */.
13240 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
13250 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
13260 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
13270 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
13280 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
13290 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
132a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
132b0 74 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52  the answer is TR
132c0 55 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  UE the presence 
132d0 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  of NULLs in the 
132e0 52 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20  RHS does.       
132f0 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20   ** not matter. 
13300 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   If the LHS is n
13310 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
13320 74 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68  the RHS, then th
13330 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73  e.        ** ans
13340 77 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  wer is NULL if t
13350 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  he RHS contains 
13360 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e  NULLs and the an
13370 73 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20  swer is.        
13380 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
13390 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
133a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
133b0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
133c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
133d0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
133e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
133f0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
13400 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13410 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13430 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61  P_IsNull, rRhsHa
13440 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
13450 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
13460 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13480 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
13490 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  lse);.        sq
134a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
134b0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
134c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
134d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
134e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
134f0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  1);.  sqlite3Exp
13500 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
13510 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
13520 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
13530 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
13540 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
13550 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
13560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13570 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
13580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
13590 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
135a0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
135b0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
135c0 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
135d0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
135e0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
135f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
13600 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
13610 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
13620 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
13630 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
13640 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
13650 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
13660 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
13670 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
13680 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
13690 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
136a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
136b0 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
136c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
136d0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
136e0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
136f0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
13700 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
13710 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
13720 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
13730 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13740 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
13750 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
13760 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
13770 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
13780 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
13790 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
137a0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
137b0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
137c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
137d0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
137e0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
137f0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
13800 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
13810 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
13820 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
13830 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
13840 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
13850 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
13860 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
13870 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
13880 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
13890 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
138a0 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
138b0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
138c0 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
138d0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
138e0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
138f0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
13900 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
13910 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13920 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
13930 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
13940 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
13950 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
13960 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
13970 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
13980 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
13990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
139a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
139b0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
139c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
139d0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
139e0 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
139f0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
13a00 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
13a10 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
13a20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
13a30 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
13a40 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
13a50 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
13a60 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
13a70 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
13a80 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
13a90 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
13aa0 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
13ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ac0 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
13ad0 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
13ae0 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
13af0 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
13b00 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13b10 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
13b20 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
13b30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13b40 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
13b50 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
13b60 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
13b70 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
13b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
13b90 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
13ba0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
13bb0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
13bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13be0 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
13bf0 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c  al too big: %s",
13c00 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
13c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
13c20 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
13c30 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
13c40 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
13c50 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
13c60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
13c70 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
13c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
13c90 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
13ca0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
13cb0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
13cc0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
13cd0 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
13ce0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
13cf0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
13d00 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
13d10 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
13d20 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
13d30 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
13d40 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
13d50 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
13d60 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
13d70 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
13d80 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
13d90 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
13da0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
13db0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
13dc0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
13dd0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
13de0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13df0 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
13e00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13e10 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
13e20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
13e30 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
13e40 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
13e50 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13e60 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
13e70 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
13e80 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
13e90 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
13ea0 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
13eb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
13ec0 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
13ed0 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
13ee0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
13f00 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
13f10 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
13f20 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
13f30 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
13f40 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
13f50 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
13f60 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13f70 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
13f80 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
13f90 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
13fa0 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
13fb0 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
13fc0 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
13fd0 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
13fe0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13ff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
14000 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
14010 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
14020 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
14030 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
14040 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
14050 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
14060 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
14070 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
14080 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
14090 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
140a0 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
140b0 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
140c0 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
140d0 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
140e0 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
140f0 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
14100 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
14110 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
14120 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
14130 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
14140 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14150 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
14160 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c  t( p->iReg==0 ||
14170 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62   p->iTable!=iTab
14180 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   || p->iColumn!=
14190 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iCol );.  }.#end
141a0 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e  if..  /* Find an
141b0 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20   empty slot and 
141c0 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20  replace it */.  
141d0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
141e0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
141f0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14200 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14210 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30    if( p->iReg==0
14220 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65   ){.      p->iLe
14230 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
14240 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
14250 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
14260 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  b;.      p->iCol
14270 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
14280 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
14290 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
142a0 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
142b0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
142c0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
142d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
142e0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63    }..  /* Replac
142f0 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e  e the last recen
14300 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69  tly used */.  mi
14310 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66  nLru = 0x7ffffff
14320 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31  f;.  idxLru = -1
14330 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
14340 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14350 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14360 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14370 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75  {.    if( p->lru
14380 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
14390 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20   idxLru = i;.   
143a0 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
143b0 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ru;.    }.  }.  
143c0 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72  if( ALWAYS(idxLr
143d0 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d  u>=0) ){.    p =
143e0 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
143f0 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20  che[idxLru];.   
14400 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
14410 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14420 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
14430 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69  = iTab;.    p->i
14440 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
14450 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
14460 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  g;.    p->tempRe
14470 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72  g = 0;.    p->lr
14480 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
14490 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  heCnt++;.    ret
144a0 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  urn;.  }.}../*.*
144b0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
144c0 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65  registers betwee
144d0 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65  n iReg..iReg+nRe
144e0 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76  g-1 are being ov
144f0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75  erwritten..** Pu
14500 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  rge the range of
14510 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20   registers from 
14520 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
14530 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14540 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
14550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14560 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
14570 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
14580 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67  int iLast = iReg
14590 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73   + nReg - 1;.  s
145a0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
145b0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
145c0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
145d0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
145e0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
145f0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
14600 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
14610 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69   r>=iReg && r<=i
14620 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  Last ){.      ca
14630 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
14640 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
14650 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
14660 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14670 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72  Remember the cur
14680 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  rent column cach
14690 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20  e context.  Any 
146a0 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65  new entries adde
146b0 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68  d.** added to th
146c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
146d0 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61  fter this call a
146e0 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20  re removed when 
146f0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
14700 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e  ding pop occurs.
14710 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14720 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61  ExprCachePush(Pa
14730 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14740 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14750 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51  vel++;.#ifdef SQ
14760 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
14770 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
14780 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
14790 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
147a0 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74    printf("PUSH t
147b0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
147c0 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
147d0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
147e0 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
147f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
14800 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
14810 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
14820 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
14830 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70  vious sqlite3Exp
14840 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61  rCachePush opera
14850 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
14860 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a  words, restore.*
14870 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  * the cache to t
14880 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
14890 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73  in prior the mos
148a0 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a  t recent Push..*
148b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
148c0 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
148d0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
148e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
148f0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
14900 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
14910 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20  cheLevel>=1 );. 
14920 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14930 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53  evel--;.#ifdef S
14940 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
14950 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
14960 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14970 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
14980 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20     printf("POP  
14990 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
149a0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
149b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
149c0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
149d0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
149e0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
149f0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14a00 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d  f( p->iReg && p-
14a10 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
14a20 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
14a30 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
14a40 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
14a50 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
14a60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
14a70 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
14a80 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
14a90 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
14aa0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
14ab0 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
14ac0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
14ad0 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
14ae0 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
14af0 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
14b00 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
14b10 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
14b20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
14b30 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
14b40 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
14b50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
14b60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14b70 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
14b80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
14b90 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
14ba0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
14bb0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
14bc0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14bd0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14be0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14bf0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14c00 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
14c10 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
14c20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
14c30 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
14c40 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
14c50 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
14c60 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
14c70 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
14c80 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
14c90 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
14ca0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
14cb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14cc0 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
14cd0 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
14ce0 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
14cf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
14d00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
14d10 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
14d20 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
14d30 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
14d40 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
14d50 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
14d60 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
14d70 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
14d80 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
14d90 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
14da0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
14db0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
14dc0 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
14dd0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
14de0 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
14df0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
14e00 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
14e10 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
14e20 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
14e30 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
14e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
14e50 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
14e60 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14e70 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
14e80 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
14e90 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
14ea0 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20   = iTabCur;.    
14eb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
14ec0 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
14ed0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
14ee0 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
14ef0 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
14f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
14f10 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
14f20 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ble(pParse->pVdb
14f30 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  e, pIdx->pTable,
14f40 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20   iTabCur,.      
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
14f70 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a  abCol, regOut);.
14f80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
14f90 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
14fa0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
14fb0 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
14fc0 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
14fd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14fe0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
14ff0 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
15000 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
15010 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
15020 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
15030 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
15040 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
15050 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
15060 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
15070 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Cur,    /* The t
15080 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72  able cursor.  Or
15090 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66   the PK cursor f
150a0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
150b0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
150c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
150d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
150e0 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
150f0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
15100 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
15110 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  e into this regi
15120 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
15130 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
15140 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
15150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15160 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
15170 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
15180 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
15190 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
151a0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
151b0 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
151c0 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
151d0 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
151e0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
151f0 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
15200 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
15210 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
15220 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
15230 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
15240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15250 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
15260 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
15270 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
15280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
15290 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
152a0 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
152b0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
152c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
152d0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
152e0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
152f0 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
15300 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
15310 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
15320 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
15330 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66  er. .**.** An ef
15340 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
15350 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
15360 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
15370 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a  er iReg.  This.*
15380 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65  * is not garante
15390 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d  eed for GetColum
153a0 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74  n() - the result
153b0 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
153c0 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65  n.** any registe
153d0 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75  r.  But the resu
153e0 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  lt is guaranteed
153f0 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69   to land in regi
15400 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72  ster iReg.** for
15410 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28   GetColumnToReg(
15420 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  )..**.** There m
15430 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
15440 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
15450 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
15460 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
15470 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
15480 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
15490 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
154a0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
154b0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
154c0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
154d0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
154e0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
154f0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
15500 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
15510 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
15520 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
15530 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
15540 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
15550 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
15560 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
15570 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
15580 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
15590 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
155a0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
155b0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
155c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
155d0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
155e0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
155f0 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
15600 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
15610 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
15620 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
15630 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15640 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
15650 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
15660 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
15670 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
15680 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
15690 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
156a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
156b0 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
156c0 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
156d0 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
156e0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
156f0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
15700 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
15710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15720 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
15730 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
15740 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15750 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
15760 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
15770 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
15780 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
15790 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
157a0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
157b0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
157c0 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
157d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
157e0 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20   p5);.  }else{  
157f0 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70   .    sqlite3Exp
15800 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
15810 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
15820 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a  umn, iReg);.  }.
15830 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
15840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
15850 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
15860 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Reg(.  Parse *pP
15870 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
15880 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
15890 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
158a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
158b0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
158c0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
158d0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
158e0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
158f0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
15900 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
15910 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
15920 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
15930 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
15940 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
15950 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
15960 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
15970 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
15980 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  .){.  int r1 = s
15990 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
159a0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
159b0 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  pTab, iColumn, i
159c0 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b  Table, iReg, 0);
159d0 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67 20  .  if( r1!=iReg 
159e0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
159f0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
15a00 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  e, OP_SCopy, r1,
15a10 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iReg);.}.../*.*
15a20 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
15a30 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
15a40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15a50 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
15a60 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15a70 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15a80 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
15a90 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
15aa0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
15ab0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
15ac0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
15ad0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
15ae0 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a  "CLEAR\n");.  }.
15af0 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
15b00 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
15b10 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
15b20 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
15b30 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
15b40 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ->iReg ){.      
15b50 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
15b60 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
15b70 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
15b80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15b90 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
15ba0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
15bb0 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
15bc0 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
15bd0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
15be0 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
15bf0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
15c00 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
15c10 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
15c20 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
15c30 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
15c40 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
15c50 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
15c60 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
15c70 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
15c80 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
15c90 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
15ca0 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
15cb0 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
15cc0 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
15cd0 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
15ce0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
15cf0 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
15d00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
15d10 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
15d20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
15d30 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
15d40 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
15d50 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
15d60 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
15d70 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
15d80 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
15d90 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
15da0 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
15db0 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
15dc0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
15dd0 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
15de0 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
15df0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
15e00 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
15e10 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
15e20 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
15e30 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
15e40 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
15e50 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
15e60 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
15e70 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
15e80 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
15e90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15ea0 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
15eb0 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
15ec0 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
15ed0 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
15ee0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
15ef0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
15f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f10 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
15f20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15f30 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
15f40 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
15f50 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
15f60 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
15f70 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
15f80 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
15f90 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
15fa0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
15fb0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
15fc0 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
15fd0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
15fe0 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
15ff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16000 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
16010 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
16020 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
16030 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  T */../*.** Conv
16040 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ert an expressio
16050 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
16060 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69  EGISTER.*/.stati
16070 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
16080 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
16090 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
160a0 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
160b0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
160c0 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
160d0 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
160e0 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
160f0 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
16100 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
16110 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
16120 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
16130 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
16140 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
16150 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
16160 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
16170 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
16180 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
16190 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
161a0 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
161b0 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
161c0 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
161d0 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
161e0 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
161f0 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
16200 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
16210 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
16220 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
16230 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
16240 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
16250 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
16260 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
16270 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
16280 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
16290 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
162a0 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
162b0 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
162c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
162d0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
162e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
162f0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
16300 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
16310 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16320 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
16330 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
16340 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16360 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
16370 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
16380 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
16390 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
163a0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
163b0 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
163c0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
163d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
163e0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
163f0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
16400 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
16410 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
16420 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
16430 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
16440 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
16450 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
16460 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
16470 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
16480 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
16490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
164a0 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
164b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
164c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
164d0 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20   tempX;         
164e0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
164f0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ry expression no
16500 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
16510 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
16520 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
16530 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
16540 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16550 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16560 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
16570 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
16580 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
16590 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
165a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
165b0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
165c0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
165d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
165e0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
165f0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
16600 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
16610 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
16620 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
16630 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
16640 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
16650 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
16660 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
16670 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
16680 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
16690 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
166a0 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
166b0 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
166c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
166d0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
166e0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
166f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16700 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16710 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
16720 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
16730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
16760 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
16770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16780 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
16790 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
167a0 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
167b0 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
167c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
167d0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
167e0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
167f0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
16800 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
16810 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
16820 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
16830 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
16840 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
16850 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
16860 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
16870 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
16880 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
16890 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
168a0 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
168b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
168c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
168d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e          /* Codin
168e0 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
168f0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16900 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63  an index where c
16910 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20  olumn names.    
16920 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
16930 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74  index refer to t
16940 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63  he table to whic
16950 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f  h the index belo
16960 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ngs */.         
16970 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
16980 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
16990 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
169a0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
169b0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
169c0 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
169d0 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
16a00 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
16a10 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
16a40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16a50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16a60 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
16a70 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
16a80 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
16a90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16aa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
16ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
16ac0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
16ad0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
16ae0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16af0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16b00 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16b10 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
16b20 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
16b30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
16b40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16b50 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
16b60 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
16b70 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
16b80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
16b90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16ba0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
16bc0 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
16bd0 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
16be0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
16bf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16c00 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
16c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
16c30 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
16c40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16c50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16c60 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
16c70 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
16c80 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
16c90 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
16ca0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
16cb0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
16cc0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16cd0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16ce0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16d00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
16d10 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
16d20 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
16d30 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
16d40 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16d50 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
16d60 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
16d70 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
16d80 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
16d90 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
16da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
16db0 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
16dc0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
16dd0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
16de0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
16df0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
16e00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16e10 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
16e20 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
16e30 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
16e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16e50 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
16e60 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
16e70 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16e80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16e90 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16ea0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16eb0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
16ec0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
16ed0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
16ee0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
16ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
16f10 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
16f20 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
16f30 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16f40 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
16f50 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16f60 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16f70 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
16f80 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
16f90 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
16fa0 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
16fb0 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
16fc0 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
16fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16fe0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
16ff0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
17000 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
17010 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
17020 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
17030 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17040 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
17050 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
17060 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
17070 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
17080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17090 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
170a0 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
170b0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
170c0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
170d0 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
170e0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
170f0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
17100 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
17110 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17120 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17130 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
17140 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17160 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
17170 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
17180 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
17190 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
171a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171b0 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
171c0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
171f0 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
17200 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
17210 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
17220 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
17230 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
17240 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
17250 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17260 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
17270 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
17280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17290 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
172a0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
172b0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
172c0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
172d0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
172e0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
172f0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
17300 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
17310 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17320 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17330 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17340 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
17350 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
17360 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17370 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17380 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
17390 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
173a0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
173b0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
173c0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
173f0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
17400 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
17410 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
17420 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
17430 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
17440 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
17450 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
17460 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
17470 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
17480 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17490 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
174a0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
174b0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
174c0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
174d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
174e0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
174f0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
17500 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
17510 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
17520 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
17530 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
17540 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
17550 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
17560 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
17570 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
17580 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
17590 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
175a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
175b0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
175c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
175d0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
175e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
175f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17600 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
17610 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17620 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17630 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
17640 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
17650 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17660 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
17670 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
17680 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
17690 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
176a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
176b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
176c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
176d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
176e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
176f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
17700 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
17710 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
17720 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
17730 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
17740 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
17750 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
17760 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17780 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
17790 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
177a0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
177b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
177c0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
177d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
177e0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
177f0 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
17800 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17810 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17820 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
17830 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
17840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17850 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
17860 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
17870 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
17880 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
17890 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
178a0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
178b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
178c0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
178d0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
178e0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
178f0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
17900 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
17910 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
17920 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
17930 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
17940 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
17950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17960 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
17970 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
17980 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
17990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
179a0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
179b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
179c0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
179d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
179e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
179f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17a00 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
17a10 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
17a20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
17a30 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
17a40 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
17a50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
17a60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17a70 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
17a80 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
17a90 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
17aa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17ab0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
17ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17ad0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
17ae0 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
17af0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
17b00 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
17b10 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
17b20 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
17b30 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17b40 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
17b50 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
17b60 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
17b70 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
17b80 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
17b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17ba0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
17bb0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
17bc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
17bd0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
17be0 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
17bf0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
17c00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17c10 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
17c20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
17c30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17c40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17c50 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17c60 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17c70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17c80 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17c90 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
17ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17cb0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
17cc0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
17cd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17ce0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17cf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17d00 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17d20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
17d30 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
17d40 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
17d50 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
17d60 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
17d70 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
17d80 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
17d90 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
17da0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
17db0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
17dc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17dd0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
17de0 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
17df0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
17e00 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
17e10 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17e20 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17e30 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
17e40 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
17e50 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
17e60 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
17e70 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  et);.#endif.    
17e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17e90 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49   tempX.op = TK_I
17ea0 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
17eb0 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50  tempX.flags = EP
17ec0 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b  _IntValue|EP_Tok
17ed0 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20  enOnly;.        
17ee0 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d  tempX.u.iValue =
17ef0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   0;.        r1 =
17f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17f10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65  Temp(pParse, &te
17f20 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  mpX, &regFree1);
17f30 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
17f40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17f50 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17f60 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17f70 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
17f80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17f90 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
17fa0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
17fb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17fc0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
17fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
17fe0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
17ff0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
18010 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
18020 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
18030 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
18040 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
18050 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18060 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
18070 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
18080 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
18090 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
180a0 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
180b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
180c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
180d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
180e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
180f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18100 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18110 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
18120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18130 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
18140 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
18150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18160 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
18170 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
18180 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
18190 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
181a0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
181b0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
181c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
181d0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
181e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
181f0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
18200 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
18210 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
18220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18240 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
18250 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
18260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18270 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
18280 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
18290 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
182a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
182b0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
182c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182d0 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
182e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
182f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
18300 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
18310 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
18320 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
18330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18350 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
18360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18370 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18380 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
18390 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
183a0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
183b0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
183c0 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
183d0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
183e0 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
183f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18400 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
18410 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
18420 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
18430 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18440 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
18450 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
18460 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
18470 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
18480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18490 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
184a0 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
184b0 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
184c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
184d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
184e0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
184f0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
18500 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
18510 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
18520 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
18530 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
18540 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18550 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
18560 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
18570 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
18580 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
18590 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
185a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
185b0 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
185c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
185d0 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
185e0 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
185f0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
18600 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
18610 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
18620 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
18630 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
18640 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
18650 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
18660 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
18670 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
18680 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18690 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
186a0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
186b0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
186c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
186d0 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
186e0 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
186f0 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
18700 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
18710 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
18720 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
18730 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18740 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18750 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
18770 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18780 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
18790 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
187a0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
187b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
187c0 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
187d0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
187e0 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
187f0 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
18800 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
18810 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18820 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
18830 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
18840 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
18850 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
18860 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
18870 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
18880 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
18890 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
188a0 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20  Id, nId, nFarg, 
188b0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
188c0 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
188d0 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 20 29 7b 0a  ef->xFunc==0 ){.
188e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
188f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18900 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f  "unknown functio
18910 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  n: %.*s()", nId,
18920 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62   zId);.        b
18930 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
18940 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
18950 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65  a direct impleme
18960 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ntation of the b
18970 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45  uilt-in COALESCE
18980 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  () and.      ** 
18990 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f  IFNULL() functio
189a0 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  ns.  This avoids
189b0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61   unnecessary eva
189c0 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  luation of.     
189d0 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61   ** arguments pa
189e0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  st the first non
189f0 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a  -NULL argument..
18a00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18a10 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
18a20 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
18a30 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20  _COALESCE ){.   
18a40 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c       int endCoal
18a50 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  esce = sqlite3Vd
18a60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18a80 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20  nFarg>=2 );.    
18a90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18aa0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
18ab0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
18ac0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
18ad0 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67  for(i=1; i<nFarg
18ae0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18b00 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op2(v, OP_NotNul
18b10 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f  l, target, endCo
18b20 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
18b30 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
18b40 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
18b50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
18b60 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72  move(pParse, tar
18b70 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
18b80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
18b90 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
18ba0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18bb0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
18bc0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
18bd0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
18be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18bf0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
18c00 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rse);.        }.
18c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18c20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18c30 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  v, endCoalesce);
18c40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18c50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18c60 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29  * The UNLIKELY()
18c70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
18c80 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c  o-op.  The resul
18c90 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20  t is the value. 
18ca0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
18cb0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20  irst argument.. 
18cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18cd0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
18ce0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
18cf0 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20  UNLIKELY ){.    
18d00 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
18d10 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=1 );.        
18d20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
18d30 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
18d40 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
18d50 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
18d60 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18d70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18d80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
18d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18da0 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
18db0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
18dc0 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
18dd0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
18de0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33    testcase( i==3
18df0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  1 );.          c
18e00 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  onstMask |= MASK
18e10 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20  BIT32(i);.      
18e20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
18e30 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
18e40 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
18e50 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21  EEDCOLL)!=0 && !
18e60 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
18e70 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
18e80 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
18e90 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69  arse, pFarg->a[i
18ea0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
18eb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18ec0 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20    if( pFarg ){. 
18ed0 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74         if( const
18ee0 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  Mask ){.        
18ef0 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e    r1 = pParse->n
18f00 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  Mem+1;.         
18f10 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
18f20 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20   nFarg;.        
18f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18f40 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
18f50 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
18f60 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
18f70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
18f80 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64  For length() and
18f90 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69   typeof() functi
18fa0 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ons with a colum
18fb0 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20  n argument,.    
18fc0 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50      ** set the P
18fd0 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  5 parameter to t
18fe0 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
18ff0 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45  ode to OPFLAG_LE
19000 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20  NGTHARG.        
19010 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50  ** or OPFLAG_TYP
19020 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76  EOFARG respectiv
19030 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e  ely, to avoid un
19040 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20  necessary data. 
19050 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e         ** loadin
19060 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g..        */.  
19070 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
19080 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51  >funcFlags & (SQ
19090 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
190a0 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50  |SQLITE_FUNC_TYP
190b0 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  EOF))!=0 ){.    
190c0 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b        u8 exprOp;
190d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
190e0 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20  t( nFarg==1 );. 
190f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19100 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
19110 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
19120 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72     exprOp = pFar
19130 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
19140 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  p;.          if(
19150 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55   exprOp==TK_COLU
19160 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b  MN || exprOp==TK
19170 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
19180 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
19190 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c  t( SQLITE_FUNC_L
191a0 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45  ENGTH==OPFLAG_LE
191b0 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
191c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
191d0 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
191e0 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  F==OPFLAG_TYPEOF
191f0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
19200 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
19210 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f  f->funcFlags & O
19220 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
19230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
19240 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
19250 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20  ->op2 = .       
19260 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
19270 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50  >funcFlags & (OP
19280 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f  FLAG_LENGTHARG|O
19290 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
192a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
192b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
192c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
192d0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20  ePush(pParse);  
192e0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
192f0 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
19300 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19310 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
19320 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20  rse, pFarg, r1, 
19330 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
19360 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  UP|SQLITE_ECEL_F
19370 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20  ACTOR);.        
19380 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19390 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20 20  Pop(pParse);    
193a0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
193b0 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
193c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
193d0 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   r1 = 0;.      }
193e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
193f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
19400 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69  E.      /* Possi
19410 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65  bly overload the
19420 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65   function if the
19430 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
19440 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69  is.      ** a vi
19450 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75  rtual table colu
19460 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  mn..      **.   
19470 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20     ** For infix 
19480 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c  functions (LIKE,
19490 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61   GLOB, REGEXP, a
194a0 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68  nd MATCH) use th
194b0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  e.      ** secon
194c0 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20  d argument, not 
194d0 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68  the first, as th
194e0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65  e argument to te
194f0 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  st to.      ** s
19500 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f  ee if it is a co
19510 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61  lumn in a virtua
19520 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69  l table.  This i
19530 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20  s done because. 
19540 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74       ** the left
19550 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69   operand of infi
19560 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65  x functions (the
19570 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74   operand we want
19580 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   to.      ** con
19590 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67  trol overloading
195a0 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65  ) ends up as the
195b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
195c0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
195d0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
195e0 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c  expression "A gl
195f0 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c  ob B" is equival
19600 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
19610 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65   "glob(B,A).  We
19620 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65   want to use the
19630 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22   A in "A glob B"
19640 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a   to test.      *
19650 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f  * for function o
19660 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74  verloading.  But
19670 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65   we use the B te
19680 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29  rm in "glob(B,A)
19690 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
196a0 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26    if( nFarg>=2 &
196b0 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  & (pExpr->flags 
196c0 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20  & EP_InfixFunc) 
196d0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
196e0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
196f0 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
19700 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
19710 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  Farg->a[1].pExpr
19720 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
19730 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20  f( nFarg>0 ){.  
19740 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
19750 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
19760 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
19770 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
19780 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
19790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
197a0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
197b0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
197c0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
197d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
197e0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
197f0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
19800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19810 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
19820 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
19830 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
19840 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
19850 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19860 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19870 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e  P_Function0, con
19880 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
19890 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
198a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
198b0 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
198c0 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
198d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
198e0 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
198f0 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26       if( nFarg &
19900 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29  & constMask==0 )
19910 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19920 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
19930 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
19940 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
19950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19970 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19980 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
19990 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
199a0 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  LECT: {.      te
199b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
199c0 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
199d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
199e0 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
199f0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
19a00 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
19a10 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
19a20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19a30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19a40 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
19a50 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
19a60 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19a70 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
19a80 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
19a90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19aa0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
19ab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19ac0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
19ad0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
19ae0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
19af0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19b00 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
19b10 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
19b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19b40 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
19b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
19b60 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
19b70 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
19b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b90 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
19ba0 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
19bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19bc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19bd0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
19be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19bf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19c00 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
19c10 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
19c20 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
19c30 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
19c40 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
19c50 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
19c60 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
19c70 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
19c80 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
19c90 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
19ca0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
19cb0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
19cc0 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
19cd0 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
19ce0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
19cf0 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
19d00 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
19d10 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
19d20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
19d30 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
19d40 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
19d50 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19d60 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
19d70 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  x.pList->a;.    
19d80 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
19d90 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
19da0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
19db0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
19dc0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
19dd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
19de0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
19df0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19e00 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
19e10 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
19e20 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19e30 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
19e40 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
19e50 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
19e60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19e70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19e80 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
19e90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19ea0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
19eb0 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
19ec0 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
19ef0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20  LITE_STOREP2);  
19f00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19f10 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
19f20 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
19f30 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
19f40 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
19f50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
19f60 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
19f70 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
19f80 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19f90 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
19fa0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
19fb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19fc0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
19fd0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
19fe0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
19ff0 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
1a000 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
1a010 50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  P2);.      VdbeC
1a020 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a040 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
1a050 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
1a060 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a070 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a080 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
1a090 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1a0a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
1a0b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a0c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a0d0 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
1a0e0 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
1a0f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1a100 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1a110 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1a120 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1a130 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a140 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
1a150 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
1a160 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
1a170 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
1a180 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
1a190 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
1a1a0 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
1a1b0 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
1a1c0 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
1a1d0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
1a1e0 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
1a1f0 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
1a200 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
1a210 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
1a220 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
1a230 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
1a240 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
1a250 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
1a260 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1a270 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
1a280 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
1a290 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
1a2a0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1a2b0 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
1a2c0 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
1a2d0 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
1a2e0 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
1a2f0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
1a300 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
1a310 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
1a320 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
1a330 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
1a340 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
1a350 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
1a360 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
1a370 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
1a380 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
1a390 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
1a3a0 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
1a3b0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
1a3c0 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
1a3d0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1a3e0 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
1a3f0 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
1a400 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
1a410 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
1a420 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
1a430 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
1a440 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
1a450 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
1a460 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
1a470 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
1a480 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
1a490 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
1a4a0 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
1a4b0 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
1a4c0 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
1a4d0 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
1a4e0 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
1a4f0 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
1a500 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
1a510 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
1a520 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
1a530 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
1a540 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
1a550 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
1a560 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
1a570 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
1a580 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
1a590 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
1a5a0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
1a5b0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
1a5c0 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
1a5d0 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
1a5e0 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
1a5f0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
1a600 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
1a610 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
1a620 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
1a630 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
1a640 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
1a650 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
1a660 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
1a670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
1a680 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
1a690 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
1a6a0 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
1a6b0 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
1a6c0 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
1a6d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
1a6e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1a6f0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
1a700 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
1a710 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a720 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
1a730 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
1a740 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
1a750 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a760 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
1a770 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
1a780 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
1a790 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a7a0 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
1a7b0 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
1a7c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a7d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
1a7e0 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
1a7f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1a800 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
1a810 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
1a820 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
1a830 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
1a840 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
1a850 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
1a860 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
1a870 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
1a880 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
1a890 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
1a8a0 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
1a8b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a8c0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1a8d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
1a8e0 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
1a8f0 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
1a900 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
1a910 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
1a920 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
1a930 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
1a940 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
1a950 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a  is really real..
1a960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1a970 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a980 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c  -60985-57662 SQL
1a990 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  ite will convert
1a9a0 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20   the value back 
1a9b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61  to.      ** floa
1a9c0 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20  ting point when 
1a9d0 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72  extracting it fr
1a9e0 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20  om the record.  
1a9f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
1aa00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
1aa10 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
1aa20 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
1aa30 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
1aa40 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
1aa50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1aa60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aa70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
1aa80 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
1aa90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1aaa0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aab0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
1aac0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
1aad0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
1aae0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
1aaf0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
1ab00 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
1ab10 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
1ab20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
1ab30 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
1ab40 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1ab50 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1ab60 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1ab70 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1ab80 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
1ab90 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
1aba0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
1abb0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
1abc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1abd0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
1abe0 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
1abf0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
1ac00 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
1ac10 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
1ac20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1ac30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
1ac40 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
1ac50 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1ac60 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
1ac70 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
1ac80 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
1ac90 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
1aca0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
1acb0 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
1acc0 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
1acd0 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
1ace0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1acf0 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
1ad00 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
1ad10 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
1ad20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
1ad30 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
1ad40 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
1ad50 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1ad60 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
1ad70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
1ad80 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
1ad90 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
1ada0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1adb0 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
1adc0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
1add0 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
1ade0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
1adf0 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
1ae00 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
1ae10 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
1ae20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
1ae30 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
1ae40 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
1ae50 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
1ae60 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
1ae70 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae90 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
1aea0 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
1aeb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
1aec0 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
1aed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
1aee0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
1aef0 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
1af00 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
1af10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
1af30 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
1af40 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
1af50 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1af70 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1af80 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
1af90 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
1afa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1afb0 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
1afc0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
1afd0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1afe0 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
1aff0 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
1b000 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
1b010 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b030 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
1b040 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
1b050 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
1b080 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
1b090 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b0b0 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
1b0c0 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
1b0d0 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
1b0e0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
1b0f0 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
1b100 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
1b110 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1b120 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b130 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1b140 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
1b150 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
1b160 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
1b170 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
1b180 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
1b190 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1b1a0 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
1b1b0 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
1b1c0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
1b1d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1b1e0 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
1b1f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b200 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
1b210 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
1b220 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
1b230 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
1b240 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b250 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
1b260 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
1b270 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
1b280 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70  empX, sqlite3Exp
1b290 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1b2a0 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  , pX, &regFree1)
1b2b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1b2c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1b2d0 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f   );.        opCo
1b2e0 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
1b2f0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
1b300 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
1b310 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
1b320 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
1b330 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
1b340 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
1b350 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
1b360 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
1b370 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
1b380 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
1b390 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
1b3a0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
1b3b0 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
1b3c0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
1b3d0 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
1b3e0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
1b3f0 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
1b400 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
1b410 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
1b420 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
1b430 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
1b440 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
1b450 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1b460 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
1b470 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b480 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1b490 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1b4a0 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
1b4b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
1b4c0 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
1b4d0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
1b4e0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
1b4f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1b500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b510 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
1b520 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
1b530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b540 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
1b550 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b560 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
1b570 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
1b580 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
1b590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b5a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1b5b0 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
1b5c0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
1b5d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
1b5e0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
1b5f0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
1b600 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1b610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b620 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1b630 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
1b640 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1b650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b660 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
1b670 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
1b680 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1b690 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1b6a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b6b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
1b6c0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
1b6d0 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
1b6e0 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
1b6f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1b700 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1b710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b720 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1b730 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
1b740 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
1b750 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b760 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1b770 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
1b780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1b790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b7a0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
1b7b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
1b7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1b7d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1b7e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
1b7f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1b800 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1b810 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
1b820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b830 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1b840 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
1b850 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b860 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1b870 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
1b880 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
1b890 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1b8a0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b8b0 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
1b8c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
1b8d0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1b8e0 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
1b8f0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1b900 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
1b910 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
1b920 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1b930 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
1b940 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
1b950 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
1b960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b970 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b990 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
1b9a0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
1b9b0 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
1b9c0 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
1b9d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1b9e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b9f0 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
1ba00 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
1ba10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1ba20 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
1ba30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1ba40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ba50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ba60 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1ba70 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1ba80 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
1ba90 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
1baa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1bab0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
1bac0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
1bad0 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
1bae0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
1baf0 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
1bb00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bb10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bb20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
1bb30 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
1bb40 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
1bb50 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1bb80 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
1bb90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
1bba0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
1bbb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bbc0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
1bbd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1bbe0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1bbf0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1bc00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1bc10 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1bc20 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
1bc30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
1bc40 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
1bc50 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
1bc60 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
1bc70 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
1bc80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1bc90 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
1bca0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1bcb0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1bcc0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1bcd0 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1bce0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
1bcf0 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
1bd00 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
1bd10 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
1bd20 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
1bd30 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
1bd40 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
1bd50 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20  u8 reusable     
1bd60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1bd70 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
1bd80 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  reusable */.){. 
1bd90 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
1bda0 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
1bdb0 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
1bdc0 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
1bdd0 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78  ConstExpr;.  pEx
1bde0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1bdf0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
1be00 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
1be10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1be20 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1be30 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
1be40 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
1be50 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1be60 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
1be70 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
1be80 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
1be90 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
1bea0 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
1beb0 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c  usable = reusabl
1bec0 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  e;.  }.  pParse-
1bed0 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
1bee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1bef0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
1bf00 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1bf10 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
1bf20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
1bf30 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
1bf40 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1bf50 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
1bf60 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
1bf70 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
1bf80 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
1bf90 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
1bfa0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
1bfb0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
1bfc0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
1bfd0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
1bfe0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
1bff0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
1c000 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
1c010 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
1c020 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
1c030 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
1c040 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
1c050 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
1c060 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
1c070 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
1c080 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
1c090 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1c0a0 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
1c0b0 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
1c0c0 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
1c0d0 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
1c0e0 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
1c0f0 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
1c100 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1c110 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c120 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c130 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
1c140 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
1c150 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1c160 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  te(pExpr);.  if(
1c170 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
1c180 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
1c190 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
1c1a0 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
1c1b0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
1c1c0 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
1c1d0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1c1e0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  *p = pParse->pCo
1c1f0 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  nstExpr;.    int
1c200 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   i;.    *pReg  =
1c210 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b   0;.    if( p ){
1c220 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1c230 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c240 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  em;.      for(pI
1c250 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e  tem=p->a, i=p->n
1c260 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d  Expr; i>0; pItem
1c270 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ++, i--){.      
1c280 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
1c290 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
1c2a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
1c2b0 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
1c2c0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
1c2d0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
1c2e0 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
1c2f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32    }.    }.    r2
1c310 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c320 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  m;.    sqlite3Ex
1c330 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
1c340 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20  rse, pExpr, r2, 
1c350 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1c360 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
1c370 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1c380 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
1c390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1c3a0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1c3b0 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
1c3c0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
1c3d0 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
1c3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1c3f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c400 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1c410 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
1c420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c430 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
1c440 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1c450 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
1c460 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1c470 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
1c480 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
1c490 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
1c4a0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1c4b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
1c4c0 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
1c4d0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
1c4e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c4f0 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
1c500 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1c510 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
1c520 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
1c530 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
1c540 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
1c550 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
1c560 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
1c570 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1c580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1c590 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1c5a0 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
1c5b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1c5c0 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
1c5d0 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
1c5e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1c5f0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1c600 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1c610 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1c620 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
1c630 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1c640 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
1c650 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
1c660 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
1c670 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c680 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1c690 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
1c6a0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
1c6b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1c6c0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
1c6d0 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
1c6e0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
1c6f0 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
1c700 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
1c710 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
1c720 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
1c730 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
1c740 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
1c750 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
1c760 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
1c770 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1c780 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
1c790 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c7a0 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
1c7b0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c7c0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1c7d0 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
1c7e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1c7f0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
1c800 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
1c810 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
1c820 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c830 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
1c840 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
1c850 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
1c860 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1c870 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
1c880 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c890 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1c8a0 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
1c8b0 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
1c8c0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
1c8d0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c8e0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
1c8f0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
1c900 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
1c910 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
1c920 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
1c930 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
1c940 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1c950 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
1c960 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
1c970 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
1c980 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
1c990 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c9a0 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1c9b0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
1c9c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c9d0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
1c9e0 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
1c9f0 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
1ca00 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1ca10 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
1ca20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1ca30 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1ca40 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  pr, target, 0);.
1ca50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1ca60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1ca70 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1ca80 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
1ca90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1caa0 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
1cab0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1cac0 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
1cad0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
1cae0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
1caf0 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
1cb00 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
1cb10 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
1cb20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
1cb30 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
1cb40 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
1cb50 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
1cb60 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
1cb70 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
1cb80 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
1cb90 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
1cba0 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
1cbb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1cbc0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1cbd0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1cbe0 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
1cbf0 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
1cc00 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
1cc10 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
1cc20 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
1cc30 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
1cc40 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
1cc50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1cc60 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
1cc70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1cc80 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1cc90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1cca0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1ccb0 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
1ccc0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1ccd0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1cce0 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
1ccf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1cd00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
1cd10 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
1cd20 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1cd30 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
1cd40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cd50 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
1cd60 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
1cd70 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
1cd80 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
1cd90 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1cda0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
1cdb0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
1cdc0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
1cdd0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1cde0 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
1cdf0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
1ce00 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
1ce10 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
1ce20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ce30 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
1ce40 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
1ce50 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
1ce60 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
1ce70 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
1ce80 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
1ce90 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
1cea0 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
1ceb0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
1cec0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
1ced0 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
1cee0 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
1cef0 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
1cf00 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
1cf10 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
1cf20 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
1cf30 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
1cf40 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
1cf50 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
1cf60 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
1cf70 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
1cf80 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
1cf90 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
1cfa0 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
1cfb0 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
1cfc0 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
1cfd0 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
1cfe0 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
1cff0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
1d000 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1d010 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1d020 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1d030 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
1d040 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d050 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1d060 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1d070 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
1d080 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
1d090 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
1d0a0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
1d0b0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
1d0c0 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
1d0d0 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
1d0e0 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
1d0f0 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
1d100 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
1d110 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
1d120 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
1d130 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1d140 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1d150 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
1d160 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
1d170 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
1d180 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
1d190 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
1d1a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1d1b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
1d1c0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
1d1d0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1d1e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1d1f0 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
1d200 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
1d210 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
1d220 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
1d230 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
1d240 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1d250 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
1d260 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1d270 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
1d280 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1d290 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
1d2a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1d2b0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
1d2c0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1d2d0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
1d2e0 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
1d2f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  List->a[i].u.x.i
1d300 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
1d310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d320 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
1d330 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
1d340 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
1d350 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
1d360 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
1d370 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
1d380 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1d390 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1d3a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1d3b0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1d3c0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c  pExpr, target+i,
1d3d0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1d3e0 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20        int inReg 
1d3f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d400 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1d410 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
1d420 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
1d430 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
1d440 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
1d450 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Op;.        if( 
1d460 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a  copyOp==OP_Copy.
1d470 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70           && (pOp
1d480 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  =sqlite3VdbeGetO
1d490 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64  p(v, -1))->opcod
1d4a0 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  e==OP_Copy.     
1d4b0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70      && pOp->p1+p
1d4c0 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a  Op->p3+1==inReg.
1d4d0 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
1d4e0 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74  >p2+pOp->p3+1==t
1d4f0 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20  arget+i.        
1d500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
1d510 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ->p3++;.        
1d520 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d540 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e  p2(v, copyOp, in
1d550 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
1d560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d570 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1d580 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
1d590 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1d5a0 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65  or a BETWEEN ope
1d5b0 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rator..**.**    
1d5c0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
1d5d0 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  z.**.** The abov
1d5e0 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
1d5f0 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d  to .**.**    x>=
1d600 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a  y AND x<=z.**.**
1d610 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
1d620 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
1d630 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
1d640 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
1d650 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78  elimination of x
1d660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d670 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1d680 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d690 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1d6a0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1d6b0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1d6c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
1d6d0 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
1d6e0 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
1d6f0 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
1d700 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1d710 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
1d720 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   taken */.  int 
1d730 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a  jumpIfTrue,   /*
1d740 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
1d750 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
1d760 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   true */.  int j
1d770 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
1d780 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1d790 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1d7a0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  NULL */.){.  Exp
1d7b0 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f  r exprAnd;     /
1d7c0 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74  * The AND operat
1d7d0 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20  or in  x>=y AND 
1d7e0 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20  x<=z  */.  Expr 
1d7f0 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20  compLeft;    /* 
1d800 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20  The  x>=y  term 
1d810 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69  */.  Expr compRi
1d820 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78  ght;   /* The  x
1d830 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  <=z  term */.  E
1d840 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20  xpr exprX;      
1d850 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65   /* The  x  sube
1d860 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1d870 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d880 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
1d890 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  e register */.. 
1d8a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1d8b0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d8c0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1d8d0 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
1d8e0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
1d8f0 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
1d900 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
1d910 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
1d920 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
1d930 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
1d940 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
1d950 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
1d960 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1d970 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
1d980 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1d990 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1d9a0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
1d9b0 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
1d9c0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
1d9d0 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
1d9e0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
1d9f0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1da00 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  xpr;.  exprToReg
1da10 69 73 74 65 72 28 26 65 78 70 72 58 2c 20 73 71  ister(&exprX, sq
1da20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1da30 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
1da40 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
1da50 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20   if( jumpIfTrue 
1da60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1da70 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1da80 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1da90 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1daa0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1dab0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1dac0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
1dad0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1dae0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1daf0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1db00 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1db10 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  ;..  /* Ensure a
1db20 64 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76  dequate test cov
1db30 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63  erage */.  testc
1db40 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1db50 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1db60 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
1db70 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1db80 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1db90 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1dba0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1dbb0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1dbc0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1dbd0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1dbe0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1dbf0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1dc00 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1dc10 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1dc20 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1dc30 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1dc40 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1dc50 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1dc60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1dc70 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1dc80 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1dc90 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1dca0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1dcb0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1dcc0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1dcd0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1dce0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1dcf0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1dd00 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1dd10 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1dd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1dd30 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
1dd40 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
1dd50 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
1dd60 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
1dd70 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
1dd80 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1dd90 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
1dda0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1ddb0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1ddc0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1ddd0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
1dde0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
1ddf0 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
1de00 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
1de10 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
1de20 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
1de30 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1de40 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
1de50 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
1de60 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  FNULL..**.** Thi
1de70 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
1de80 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1de90 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
1dea0 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
1deb0 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
1dec0 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
1ded0 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
1dee0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
1def0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1df00 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
1df10 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
1df20 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
1df30 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
1df40 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
1df50 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
1df60 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
1df70 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
1df80 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
1df90 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
1dfa0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1dfb0 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
1dfc0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
1dfd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1dfe0 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
1dff0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1e000 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
1e010 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
1e020 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1e030 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
1e040 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1e050 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
1e060 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
1e070 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
1e080 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
1e090 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1e0a0 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
1e0b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
1e0c0 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65  R(v==0) )     re
1e0d0 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65  turn;  /* Existe
1e0e0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
1e0f0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
1e100 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
1e110 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  pr==0) ) return;
1e120 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73    /* No way this
1e130 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20   can happen */. 
1e140 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
1e150 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1e160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1e170 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
1e180 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1e190 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1e1a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e1b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e1c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e1d0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1e1e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
1e1f0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
1e200 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1e210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e220 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1e230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e240 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1e250 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e260 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1e270 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1e280 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e290 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1e2a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e2b0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1e2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e2d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1e2e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e2f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e300 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e310 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1e320 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e330 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1e340 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1e350 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1e360 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1e370 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1e380 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e390 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1e3a0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e3b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e3c0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1e3d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e3e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1e3f0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e400 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1e410 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1e420 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1e430 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e440 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1e450 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1e460 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e470 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
1e480 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
1e490 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
1e4a0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
1e4b0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
1e4c0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
1e4d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e4e0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e4f0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e500 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e510 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e520 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1e530 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1e540 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e550 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1e560 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1e570 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1e580 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e590 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1e5a0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1e5c0 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
1e5d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
1e5e0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
1e5f0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e600 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
1e610 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e620 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
1e630 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
1e640 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e650 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
1e660 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
1e670 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e680 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
1e690 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1e6a0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1e6b0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
1e6c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1e6d0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1e6e0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1e6f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e700 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1e710 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
1e720 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
1e730 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
1e740 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e750 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
1e760 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
1e770 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
1e780 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
1e790 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e7a0 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
1e7b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e7c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1e7d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e7e0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1e7f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e800 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1e810 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b  case TK_ISNOT: {
1e820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e830 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
1e840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e850 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1e860 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1e870 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1e880 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1e890 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1e8a0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1e8b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e8c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1e8d0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1e8e0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1e8f0 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1e900 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63  : TK_NE;.      c
1e910 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1e920 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e930 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e940 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1e950 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1e960 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  st, SQLITE_NULLE
1e970 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1e980 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1e990 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64  TK_EQ);.      Vd
1e9a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e9b0 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20  op==TK_NE);.    
1e9c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1e9d0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1e9e0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1e9f0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ea00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ea10 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1ea20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1ea30 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
1ea40 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
1ea50 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
1ea60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ea70 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1ea80 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
1ea90 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
1eaa0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
1eab0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
1eac0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1ead0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1eae0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1eaf0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1eb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eb10 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
1eb20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
1eb30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1eb40 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
1eb50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1eb60 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1eb70 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
1eb80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1eb90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1eba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ebb0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1ebc0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ebd0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1ebe0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43  0 );.      exprC
1ebf0 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73  odeBetween(pPars
1ec00 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1ec10 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  1, jumpIfNull);.
1ec20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ec30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ec40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1ec50 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1ec60 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
1ec70 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
1ec80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ec90 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
1eca0 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66  tIfNull = jumpIf
1ecb0 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65  Null ? dest : de
1ecc0 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20  stIfFalse;.     
1ecd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ece0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1ecf0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
1ed00 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1ed10 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1ed20 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  o(v, dest);.    
1ed30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1ed40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1ed50 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
1ed60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1ed70 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1ed80 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
1ed90 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
1eda0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
1edb0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1edc0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1edd0 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
1ede0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
1edf0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
1ee00 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
1ee10 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1ee20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ee30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ee40 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1ee50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ee60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ee70 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  If, r1, dest, ju
1ee80 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1ee90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1eea0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
1eeb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1eec0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1eed0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1eee0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1eef0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1ef00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ef10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1ef20 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1ef30 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1ef40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1ef50 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
1ef60 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
1ef70 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1ef80 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1ef90 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1efa0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1efb0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1efc0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1efd0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
1efe0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1eff0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1f000 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1f010 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
1f020 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1f030 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1f040 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1f050 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1f060 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
1f070 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
1f080 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1f090 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
1f0a0 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
1f0b0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
1f0c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1f0d0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
1f0e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1f0f0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1f100 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1f110 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1f120 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1f130 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1f140 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1f150 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1f160 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1f170 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1f180 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1f190 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1f1a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1f1b0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
1f1c0 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63  urn; /* Existenc
1f1d0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1f1e0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1f1f0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1f200 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
1f210 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
1f220 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
1f230 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
1f240 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1f250 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1f260 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
1f270 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
1f280 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
1f290 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
1f2a0 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
1f2b0 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
1f2c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1f2d0 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
1f2e0 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
1f2f0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
1f300 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
1f310 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
1f320 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
1f330 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1f340 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1f350 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
1f360 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
1f370 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
1f380 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
1f390 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
1f3a0 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
1f3b0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
1f3c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
1f3d0 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
1f3e0 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
1f3f0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
1f400 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
1f410 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
1f420 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
1f430 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
1f440 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
1f450 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
1f460 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
1f470 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1f480 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
1f490 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
1f4a0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
1f4b0 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
1f4c0 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
1f4d0 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
1f4e0 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
1f4f0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
1f500 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
1f510 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
1f520 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1f530 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
1f540 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f550 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
1f560 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
1f570 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f580 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
1f590 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
1f5a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f5b0 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
1f5c0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
1f5d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f5e0 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
1f5f0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
1f600 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
1f610 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
1f620 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f630 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
1f640 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
1f650 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f660 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
1f670 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
1f680 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
1f690 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
1f6a0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
1f6b0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1f6c0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1f6d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f6e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f6f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f700 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1f710 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1f720 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f740 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f750 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1f760 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1f770 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f780 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1f790 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1f7a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1f7b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f7c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f7d0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
1f7e0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
1f7f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f800 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
1f810 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f820 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1f830 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1f840 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f850 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
1f860 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1f870 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1f880 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f890 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1f8a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1f8b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1f8c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1f8d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f8e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f8f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1f900 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
1f910 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1f920 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
1f930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f940 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1f950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1f960 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1f970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f980 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1f990 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1f9a0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f9b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f9c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f9d0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1f9e0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1f9f0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1fa00 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1fa10 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1fa20 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
1fa30 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1fa40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1fa50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fa60 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fa70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fa80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1fa90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1faa0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fab0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1fac0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fad0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1fae0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1faf0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1fb00 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1fb10 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1fb20 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fb30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1fb40 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1fb50 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1fb60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1fb70 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1fb80 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1fb90 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1fba0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1fbb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fbc0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1fbd0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1fbe0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1fbf0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1fc00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fc10 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1fc20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1fc30 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1fc40 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1fc50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fc60 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1fc70 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1fc80 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1fc90 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1fca0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1fcb0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
1fcc0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1fcd0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1fce0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1fcf0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1fd00 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
1fd10 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1fd20 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1fd30 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1fd40 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1fd50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fd60 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1fd70 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1fd80 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
1fd90 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
1fda0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fdb0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1fdc0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1fdd0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1fde0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1fdf0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1fe00 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1fe10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fe20 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fe30 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1fe40 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1fe50 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
1fe60 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
1fe70 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63  : TK_EQ;.      c
1fe80 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1fe90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fea0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1feb0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1fec0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1fed0 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  st, SQLITE_NULLE
1fee0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1fef0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ff00 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64  TK_EQ);.      Vd
1ff10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ff20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20  op==TK_NE);.    
1ff30 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1ff40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1ff50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1ff60 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1ff70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ff80 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1ff90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1ffa0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
1ffb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ffc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ffd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1ffe0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1fff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20000 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
20010 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20020 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
20030 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
20040 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
20050 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
20060 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
20070 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
20080 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
20090 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
200a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
200b0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
200c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
200d0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
200e0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
200f0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20100 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
20110 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
20120 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
20130 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  t, 0, jumpIfNull
20140 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20150 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20160 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
20170 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
20180 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
20190 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
201a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
201b0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
201c0 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
201d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
201e0 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
201f0 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
20200 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20210 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20220 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
20230 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20240 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20260 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20270 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20280 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
20290 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
202a0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
202b0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
202c0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
202d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
202e0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
202f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
20300 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
20310 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
20320 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
20330 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
20340 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
20350 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20360 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
20370 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
20380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20390 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
203a0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
203b0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
203c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
203d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
203e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
203f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
20400 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
20410 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
20420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20430 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
20440 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
20450 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
20460 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
20470 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
20480 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
20490 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69  ./*.** Like sqli
204a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
204b0 20 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63   except that a c
204c0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70  opy is made of p
204d0 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63  Expr before.** c
204e0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20  ode generation, 
204f0 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73  and that copy is
20500 20 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63   deleted after c
20510 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ode generation. 
20520 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20  This.** ensures 
20530 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
20540 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61  l pExpr is uncha
20550 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
20560 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
20570 44 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Dup(Parse *pPars
20580 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
20590 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d  int dest,int jum
205a0 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69  pIfNull){.  sqli
205b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
205c0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43  ->db;.  Expr *pC
205d0 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
205e0 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20  rDup(db, pExpr, 
205f0 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
20600 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
20610 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20620 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
20630 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d  pCopy, dest, jum
20640 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20  pIfNull);.  }.  
20650 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
20660 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a  e(db, pCopy);.}.
20670 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
20680 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
20690 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
206a0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20  rees.  Return 0 
206b0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
206c0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f  pressions are co
206d0 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63  mpletely identic
206e0 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  al.  Return 1 if
206f0 20 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c   they differ onl
20700 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54  y.** by a COLLAT
20710 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68  E operator at th
20720 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65  e top level.  Re
20730 74 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20  turn 2 if there 
20740 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a  are differences.
20750 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
20760 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c  e top-level COLL
20770 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
20780 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c  .** If any subel
20790 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20  ement of pB has 
207a0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31  Expr.iTable==(-1
207b0 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c  ) then it is all
207c0 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61  owed.** to compa
207d0 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65  re equal to an e
207e0 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e  quivalent elemen
207f0 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70  t in pA with Exp
20800 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a  r.iTable==iTab..
20810 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64  **.** The pA sid
20820 65 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67  e might be using
20830 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49   TK_REGISTER.  I
20840 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
20850 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20  se and pB is.** 
20860 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47  not using TK_REG
20870 49 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68  ISTER but is oth
20880 65 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e  erwise equivalen
20890 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  t, then still re
208a0 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f  turn 0..**.** So
208b0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
208c0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
208d0 20 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74   2 even if the t
208e0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
208f0 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
20900 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
20910 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
20920 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
20930 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
20940 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20  al, we return 2 
20950 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
20960 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
20970 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
20980 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  2, then you do n
20990 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
209a0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
209b0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
209c0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
209d0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
209e0 65 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75  et a 0 or 1 retu
209f0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
20a00 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
20a10 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
20a20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
20a30 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
20a40 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
20a50 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
20a60 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
20a70 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61  an extra 2 - tha
20a80 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
20a90 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
20aa0 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
20ab0 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
20ac0 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
20ad0 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64  ect 0 or 1 could
20ae0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
20af0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
20b00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20b10 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
20b20 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
20b30 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46  .  u32 combinedF
20b40 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d  lags;.  if( pA==
20b50 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20  0 || pB==0 ){.  
20b60 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20    return pB==pA 
20b70 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63  ? 0 : 2;.  }.  c
20b80 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70  ombinedFlags = p
20b90 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66  A->flags | pB->f
20ba0 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62  lags;.  if( comb
20bb0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49  inedFlags & EP_I
20bc0 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
20bd0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42  f( (pA->flags&pB
20be0 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61  ->flags&EP_IntVa
20bf0 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75  lue)!=0 && pA->u
20c00 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69  .iValue==pB->u.i
20c10 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72  Value ){.      r
20c20 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
20c30 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
20c40 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
20c50 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  B->op ){.    if(
20c60 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
20c70 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
20c80 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
20c90 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32  eft, pB, iTab)<2
20ca0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20cb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
20cc0 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pB->op==TK_COL
20cd0 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45  LATE && sqlite3E
20ce0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70  xprCompare(pA, p
20cf0 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c  B->pLeft, iTab)<
20d00 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
20d10 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
20d20 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69  eturn 2;.  }.  i
20d30 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
20d40 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d  LUMN && pA->op!=
20d50 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26  TK_AGG_COLUMN &&
20d60 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
20d70 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
20d80 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
20d90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
20da0 33 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a  3StrICmp(pA->u.z
20db0 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b  Token,pB->u.zTok
20dc0 65 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  en)!=0 ) return 
20dd0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
20de0 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
20df0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
20e00 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
20e10 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b  eturn pA->op==TK
20e20 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32  _COLLATE ? 1 : 2
20e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
20e40 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
20e50 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
20e60 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
20e70 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
20e80 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  2;.  if( ALWAYS(
20e90 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
20ea0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d   EP_TokenOnly)==
20eb0 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f  0) ){.    if( co
20ec0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
20ed0 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74  _xIsSelect ) ret
20ee0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
20ef0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20f00 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
20f10 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20  >pLeft, iTab) ) 
20f20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
20f30 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
20f40 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
20f50 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61   pB->pRight, iTa
20f60 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
20f70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
20f80 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41  prListCompare(pA
20f90 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78  ->x.pList, pB->x
20fa0 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20  .pList, iTab) ) 
20fb0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
20fc0 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e  ( ALWAYS((combin
20fd0 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64  edFlags & EP_Red
20fe0 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d  uced)==0) && pA-
20ff0 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
21000 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
21010 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
21020 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
21030 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
21040 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
21050 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
21060 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
21070 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
21080 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
21090 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
210a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
210b0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
210c0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
210d0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
210e0 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
210f0 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
21100 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
21110 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
21120 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
21130 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
21140 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
21150 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
21160 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
21170 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
21180 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
21190 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
211a0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
211b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
211c0 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
211d0 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
211e0 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
211f0 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
21200 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
21210 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
21220 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
21230 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
21240 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
21250 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
21260 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
21270 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
21280 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
21290 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
212a0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
212b0 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
212c0 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
212d0 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
212e0 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
212f0 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
21300 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
21310 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
21320 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
21330 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
21340 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
21350 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
21360 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
21370 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
21380 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
21390 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
213a0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
213b0 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
213c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
213d0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
213e0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
213f0 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
21400 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
21410 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
21420 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
21430 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
21440 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
21450 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
21460 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
21470 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21480 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
21490 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
214a0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
214b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
214c0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
214d0 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
214e0 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
214f0 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
21500 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
21510 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
21520 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
21530 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
21540 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
21550 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
21560 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
21570 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
21580 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
21590 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
215a0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
215b0 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
215d0 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
215e0 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
215f0 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
21600 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
21610 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21620 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
21630 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21640 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
21650 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
21660 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
21670 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
21680 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
21690 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
216a0 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
216b0 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
216c0 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
216d0 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
216e0 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
216f0 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
21700 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
21710 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
21720 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
21730 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
21740 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
21750 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
21760 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
21770 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
21780 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
21790 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
217a0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
217b0 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
217c0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
217d0 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
217e0 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
217f0 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
21800 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
21810 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
21820 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
21830 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
21840 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
21850 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
21860 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
21870 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
21880 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
21890 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
218a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
218b0 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
218c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
218d0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
218e0 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
218f0 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
21900 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
21910 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
21920 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
21930 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
21940 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
21950 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
21960 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
21970 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
21980 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
21990 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74  NULL.   && sqlit
219a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
219b0 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70  1->pLeft, pE2->p
219c0 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20  Left, iTab)==0. 
219d0 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54    && (pE1->op!=T
219e0 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
219f0 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b  >op!=TK_IS).  ){
21a00 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
21a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21a20 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
21a30 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
21a40 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
21a50 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
21a60 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
21a70 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
21a80 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
21a90 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
21aa0 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
21ab0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
21ac0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
21ad0 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
21ae0 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
21af0 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
21b00 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
21b10 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
21b20 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
21b30 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
21b40 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
21b50 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
21b60 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
21b70 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
21b80 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
21b90 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
21ba0 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
21bb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21bc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
21bd0 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
21be0 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
21bf0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
21c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
21c10 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
21c20 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
21c30 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
21c40 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21c50 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
21c60 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
21c70 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
21c80 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
21c90 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
21ca0 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
21cb0 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
21cc0 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
21cd0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
21ce0 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
21cf0 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
21d00 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
21d10 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
21d20 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
21d30 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
21d40 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
21d50 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
21d60 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
21d70 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
21d80 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
21d90 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
21da0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
21db0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
21dc0 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
21dd0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
21de0 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
21df0 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
21e00 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
21e10 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
21e20 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
21e30 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
21e40 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53     int nSrc = pS
21e50 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20  rc ? pSrc->nSrc 
21e60 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
21e70 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  ; i<nSrc; i++){.
21e80 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
21e90 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
21ea0 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
21eb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
21ec0 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20  f( i<nSrc ){.   
21ed0 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20     p->nThis++;. 
21ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21ef0 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20  p->nOther++;.   
21f00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21f10 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
21f20 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
21f30 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61   if any of the a
21f40 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
21f50 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72  pExpr Function r
21f60 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63  eference.** pSrc
21f70 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72  List.  Return tr
21f80 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20  ue if they do.  
21f90 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65  Also return true
21fa0 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
21fb0 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d  .** has no argum
21fc0 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79  ents or has only
21fd0 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
21fe0 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  nts.  Return fal
21ff0 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72  se if pExpr.** r
22000 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e  eferences column
22010 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e  s but not column
22020 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e  s of tables foun
22030 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a  d in pSrcList..*
22040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e  /.int sqlite3Fun
22050 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
22060 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72  (Expr *pExpr, Sr
22070 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29  cList *pSrcList)
22080 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
22090 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
220a0 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  cnt;.  assert( p
220b0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
220c0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d  _FUNCTION );.  m
220d0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
220e0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
220f0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
22100 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75  rSrcCount;.  w.u
22110 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e  .pSrcCount = &cn
22120 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20  t;.  cnt.pSrc = 
22130 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e  pSrcList;.  cnt.
22140 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74  nThis = 0;.  cnt
22150 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73  .nOther = 0;.  s
22160 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
22170 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e  st(&w, pExpr->x.
22180 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
22190 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20   cnt.nThis>0 || 
221a0 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d  cnt.nOther==0;.}
221b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
221c0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
221d0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
221e0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
221f0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
22200 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
22210 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
22220 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
22230 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
22240 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
22250 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
22260 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
22270 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
22280 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
22290 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
222a0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
222b0 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
222c0 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
222d0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
222e0 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  l[0]),.       &p
222f0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
22300 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
22310 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
22320 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
22330 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
22340 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22350 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
22360 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
22370 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
22380 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
22390 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
223a0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
223b0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
223c0 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65  gInfoFunc(sqlite
223d0 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
223e0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
223f0 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
22400 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
22410 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
22420 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  b, .       pInfo
22430 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20  ->aFunc,.       
22440 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46  sizeof(pInfo->aF
22450 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  unc[0]),.       
22460 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
22470 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
22480 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
22490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
224a0 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
224b0 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
224c0 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
224d0 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
224e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
224f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
22500 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
22510 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
22520 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
22530 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
22540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
22550 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
22560 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
22570 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
22580 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
22590 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
225a0 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
225b0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
225c0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
225d0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
225e0 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
225f0 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
22600 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
22610 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
22620 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
22630 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
22640 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
22650 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
22660 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
22670 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
22680 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
22690 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
226a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
226b0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
226c0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
226d0 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
226e0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
226f0 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
22700 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
22710 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
22720 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
22730 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20  YS(pSrcList!=0) 
22740 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
22750 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22760 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
22770 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
22780 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
22790 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
227a0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
227b0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
227c0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
227d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
227e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
227f0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
22800 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
22810 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
22820 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
22830 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
22840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22850 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
22860 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
22870 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
22880 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
22890 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
228a0 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
228b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
228c0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
228d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
228e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
228f0 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
22900 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
22910 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
22920 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
22930 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
22940 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
22950 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
22960 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22970 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
22980 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
22990 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
229a0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
229b0 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
229c0 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
229d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
229e0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
229f0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
22a00 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
22a10 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
22a20 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
22a30 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
22a40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
22a60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22a70 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
22a80 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
22a90 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
22aa0 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
22ab0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
22ac0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
22ad0 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
22ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22af0 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
22b00 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
22b10 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22b20 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  >pTab = pExpr->p
22b30 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
22b40 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20     pCol->iTable 
22b50 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
22b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22b70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  Col->iColumn = p
22b80 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22ba0 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
22bb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
22bc0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
22bd0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31  orterColumn = -1
22be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22bf0 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45  pCol->pExpr = pE
22c00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
22c10 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d     if( pAggInfo-
22c20 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
22c40 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   j, n;.         
22c50 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
22c60 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d  *pGB = pAggInfo-
22c70 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
22c80 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
22c90 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
22ca0 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b  *pTerm = pGB->a;
22cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22cc0 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b   n = pGB->nExpr;
22cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ce0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a   for(j=0; j<n; j
22cf0 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d  Expr *pE = pTerm
22d20 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
22d30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22d40 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  E->op==TK_COLUMN
22d50 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d   && pE->iTable==
22d60 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
22d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d80 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
22d90 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
22da0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
22db0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
22dc0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
22dd0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
22de0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22e10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22e20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22e30 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
22e40 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  terColumn<0 ){. 
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22e60 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
22e70 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  mn = pAggInfo->n
22e80 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b  SortingColumn++;
22e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
22ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22ec0 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e  ere is now an en
22ed0 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e  try for pExpr in
22ee0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
22ef0 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20  ] (either.      
22f00 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
22f10 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65   it was there be
22f20 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20  fore or because 
22f30 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20  we just created 
22f40 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  it)..           
22f50 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   ** Convert the 
22f60 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b  pExpr to be a TK
22f70 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65  _AGG_COLUMN refe
22f80 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20  rring to that.  
22f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67            ** pAg
22fa0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e  gInfo->aCol[] en
22fb0 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
22fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22fd0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
22fe0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
22ff0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
23000 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
23010 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
23020 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
23030 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
23040 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
23050 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
23060 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20   (i16)k;.       
23070 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23080 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
23090 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
230a0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
230b0 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
230c0 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
230d0 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
230e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
230f0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
23100 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
23110 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
23120 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
23130 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e  gs & NC_InAggFun
23140 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  c)==0.       && 
23150 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44  pWalker->walkerD
23160 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32  epth==pExpr->op2
23170 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
23180 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
23190 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  e if pExpr is a 
231a0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
231b0 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a  ther aggregate .
231c0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
231d0 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65  ion that is alre
231e0 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49  ady in the pAggI
231f0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
23200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23210 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
23220 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41  func *pItem = pA
23230 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20  ggInfo->aFunc;. 
23240 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
23250 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
23260 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
23270 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
23280 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
23290 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
232a0 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29   pExpr, -1)==0 )
232b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
232c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
232d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
232e0 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
232f0 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
23300 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
23310 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
23320 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
23330 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
23340 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
23350 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
23360 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
23370 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
23380 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
23390 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
233a0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
233b0 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
233c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
233d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
233e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
233f0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23400 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
23410 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
23420 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
23430 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
23440 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
23450 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
23460 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
23470 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
23480 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
23490 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
234a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
234b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
234c0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
234d0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
234e0 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
234f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
23500 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69  ->u.zToken, sqli
23510 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
23520 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20  r->u.zToken),.  
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
23550 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ? pExpr->x.pList
23560 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
23570 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23580 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
23590 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
235a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
235b0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
235c0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
235d0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
235e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
235f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
23600 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
23610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23630 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
23640 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
23650 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
23660 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
23670 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
23680 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
23690 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
236a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
236b0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
236c0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
236d0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
236e0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
236f0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  duce);.        p
23700 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
23710 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  6)i;.        pEx
23720 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
23730 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
23740 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
23750 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
23760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
23770 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
23780 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
23790 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
237a0 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
237b0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
237c0 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c  atesInSelect(Wal
237d0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
237e0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
237f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23800 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55  ER(pWalker);.  U
23810 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
23820 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
23830 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
23840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
23850 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72  e the pExpr expr
23860 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
23870 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
23880 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
23890 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
238a0 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
238b0 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a  d to AggInfo obj
238c0 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41  ect that pNC->pA
238d0 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73  ggInfo.** points
238e0 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c   to.  Additional
238f0 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64   entries are mad
23900 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  e on the AggInfo
23910 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65   object as.** ne
23920 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
23930 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
23940 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
23950 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
23960 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
23970 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
23980 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
23990 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  rNames()..*/.voi
239a0 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
239b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
239c0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
239d0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
239e0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
239f0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
23a00 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
23a10 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79  Callback = analy
23a20 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77  zeAggregate;.  w
23a30 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
23a40 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67   = analyzeAggreg
23a50 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20  atesInSelect;.  
23a60 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
23a70 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
23a80 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73  rcList!=0 );.  s
23a90 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
23aa0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
23ab0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
23ac0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
23ad0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
23ae0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
23af0 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
23b00 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
23b10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
23b20 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
23b30 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
23b40 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
23b50 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
23b60 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
23b70 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
23b80 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
23b90 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
23ba0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
23bb0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
23bc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
23bd0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
23be0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
23bf0 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
23c00 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
23c10 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
23c20 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
23c30 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
23c40 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
23c50 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
23c60 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65  llocate a single
23c70 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f   new register fo
23c80 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f  r use to hold so
23c90 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  me intermediate 
23ca0 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73  result..*/.int s
23cb0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
23cc0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
23cd0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
23ce0 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20  TempReg==0 ){.  
23cf0 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73    return ++pPars
23d00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72  e->nMem;.  }.  r
23d10 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54  eturn pParse->aT
23d20 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d  empReg[--pParse-
23d30 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f  >nTempReg];.}../
23d40 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
23d50 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69  a register, maki
23d60 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ng available for
23d70 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20   reuse for some 
23d80 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65  other.** purpose
23d90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
23da0 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74  ister is current
23db0 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
23dc0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
23dd0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64  e, then.** the d
23de0 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64  eallocation is d
23df0 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
23e00 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c  e column cache l
23e10 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a  ine that uses.**
23e20 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62 65   the register be
23e30 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a  comes stale..*/.
23e40 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
23e50 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
23e60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
23e70 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
23e80 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
23e90 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
23ea0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
23eb0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23ec0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
23ed0 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69  he *p;.    for(i
23ee0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
23ef0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
23f00 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
23f10 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69  +, p++){.      i
23f20 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
23f30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74   ){.        p->t
23f40 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  empReg = 1;.    
23f50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
23f60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
23f70 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
23f80 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
23f90 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  +] = iReg;.  }.}
23fa0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
23fb0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61   or deallocate a
23fc0 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63   block of nReg c
23fd0 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73  onsecutive regis
23fe0 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ters.*/.int sqli
23ff0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
24000 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
24010 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
24020 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72  i, n;.  i = pPar
24030 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20  se->iRangeReg;. 
24040 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61   n = pParse->nRa
24050 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52  ngeReg;.  if( nR
24060 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73  eg<=n ){.    ass
24070 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75  ert( !usedAsColu
24080 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
24090 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20  i, i+n-1) );.   
240a0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
240b0 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  eg += nReg;.    
240c0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
240d0 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c  g -= nReg;.  }el
240e0 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72  se{.    i = pPar
240f0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
24100 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
24110 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nReg;.  }.  retu
24120 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  rn i;.}.void sql
24130 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24140 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
24150 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e  se, int iReg, in
24160 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74  t nReg){.  sqlit
24170 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
24180 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
24190 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65  nReg);.  if( nRe
241a0 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g>pParse->nRange
241b0 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73  Reg ){.    pPars
241c0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e  e->nRangeReg = n
241d0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
241e0 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65  >iRangeReg = iRe
241f0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
24200 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61  Mark all tempora
24210 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20  ry registers as 
24220 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c  being unavailabl
24230 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a  e for reuse..*/.
24240 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
24250 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50 61  rTempRegCache(Pa
24260 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
24270 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
24280 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
24290 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d  nRangeReg = 0;.}
242a0 0a                                               .