/ Hex Artifact Content
Login

Artifact 9b9fa7f825290dee945007edc9fe8fdd9b8ce49e:


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 72 20 54 4b  TK_COLLATE or TK
0be0: 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  _AS operators an
0bf0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0c00: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c10: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c20: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c30: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c40: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c50: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c60: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c70: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c90: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0cb0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cc0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cd0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0ce0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0cf0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0d00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d10: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d20: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d40: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d50: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d70: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0da0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
0dc0: 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  S );.      pExpr
0dd0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0de0: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0df0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0e00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0e10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0e20: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0e30: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0e40: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0e50: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0e60: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0e70: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0e80: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0e90: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0ea0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0eb0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0ec0: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
0ed0: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
0ee0: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
0ef0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0f00: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
0f10: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
0f20: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
0f30: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
0f40: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
0f50: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
0f60: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
0f70: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
0f80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
0f90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0fa0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
0fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0fc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0fd0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0fe0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0ff0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1010: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1020: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1030: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1040: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1050: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1060: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1070: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1080: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1090: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
10a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
10b0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
10c0: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
10d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
10e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1100: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1120: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1130: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1140: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1150: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1160: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1170: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
1180: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
1190: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
11a0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
11b0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
11c0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
11d0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
11e0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
11f0: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1200: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1210: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1220: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1230: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1240: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1250: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1270: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
1280: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
1290: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12b0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
12c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
12f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1300: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1310: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1320: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1330: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1340: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1350: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1360: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1370: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
1380: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
1390: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
13a0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
13b0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
13c0: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
13d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13e0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
13f0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1400: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1410: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1420: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1430: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1440: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1450: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
1460: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
1470: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
1480: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
1490: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
14a0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
14b0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
14c0: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
14d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
14e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
14f0: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1500: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1510: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1530: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1540: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1550: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
1560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1570: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1580: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
1590: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
15a0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
15b0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
15c0: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
15d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1610: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1650: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
1660: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
1670: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
1680: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
1690: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
16b0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
16c0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
16d0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
16e0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
16f0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1700: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1710: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1720: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1730: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1740: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1760: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1770: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1780: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1790: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
17a0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
17b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
17c0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
17d0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
17e0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
17f0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1800: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1810: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1820: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1830: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1840: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1850: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1860: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1870: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1880: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1890: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
18a0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
18b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
18d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18f0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1900: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1910: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1920: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1930: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1940: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1950: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1960: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1970: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1990: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
19a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
19b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
19c0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
19d0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
19e0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
19f0: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1a00: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1a10: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1a20: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1a30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1a40: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1a50: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1a60: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1a70: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a80: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1a90: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1aa0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1ab0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1ac0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1ad0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1ae0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1af0: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1b00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1b10: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b20: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1b30: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1b50: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1b60: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1b70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1b80: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1b90: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ba0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1bb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1bc0: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1bd0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1be0: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1bf0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c10: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1c20: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1c30: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c40: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1c50: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1c60: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c80: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1c90: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1ca0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1cb0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1cc0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1cd0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1ce0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
1cf0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
1d00: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a  E_AFF_BLOB;.  }.
1d10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1d20: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1d30: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70  a comparison exp
1d40: 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27  ression, eg. '='
1d50: 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65  , '<', IN(...) e
1d60: 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e  tc..** idx_affin
1d70: 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e  ity is the affin
1d80: 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ity of an indexe
1d90: 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e  d column. Return
1da0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20   true.** if the 
1db0: 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e  index with affin
1dc0: 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79  ity idx_affinity
1dd0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1de0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70   comparison in p
1e00: 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
1e10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
1e20: 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c  yOk(Expr *pExpr,
1e30: 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69   char idx_affini
1e40: 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ty){.  char aff 
1e50: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
1e60: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73  nity(pExpr);.  s
1e70: 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20  witch( aff ){.  
1e80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1e90: 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  F_BLOB:.      re
1ea0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65  turn 1;.    case
1eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1ec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  :.      return i
1ed0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
1ee0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
1ef0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1f00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f10: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1f20: 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  (idx_affinity);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1f40: 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65  urn the P5 value
1f50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f60: 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  used for a binar
1f70: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  y comparison.** 
1f80: 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f  opcode (OP_Eq, O
1f90: 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20  P_Ge etc.) used 
1fa0: 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72  to compare pExpr
1fb0: 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f  1 and pExpr2..*/
1fc0: 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72  .static u8 binar
1fd0: 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20  yCompareP5(Expr 
1fe0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
1ff0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
2000: 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66  fNull){.  u8 aff
2010: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2020: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2030: 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75  pr2);.  aff = (u
2040: 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  8)sqlite3Compare
2050: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
2060: 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70   aff) | (u8)jump
2070: 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e  IfNull;.  return
2080: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   aff;.}../*.** R
2090: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20a0: 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  to the collation
20b0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73   sequence that s
20c0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79  hould be used by
20d0: 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  .** a binary com
20e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
20f0: 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74   comparing pLeft
2100: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a   and pRight..**.
2110: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  ** If the left h
2120: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68  and expression h
2130: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
2140: 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68  equence type, th
2150: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64  en it is.** used
2160: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
2170: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2180: 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ce for the right
2190: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
21a0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20  .** is used, or 
21b0: 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e  the default (BIN
21c0: 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20  ARY) if neither 
21d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
21e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79   collating.** ty
21f0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  pe..**.** Argume
2200: 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e  nt pRight (but n
2210: 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65  ot pLeft) may be
2220: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
2230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2240: 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  * it is not cons
2250: 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53  idered..*/.CollS
2260: 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72  eq *sqlite3Binar
2270: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  , .  Expr *pLeft
22a0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  , .  Expr *pRigh
22b0: 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  t.){.  CollSeq *
22c0: 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pColl;.  assert(
22d0: 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20   pLeft );.  if( 
22e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
22f0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
2300: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2310: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2320: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  se, pLeft);.  }e
2330: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26  lse if( pRight &
2340: 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  & (pRight->flags
2350: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
2360: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
2370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2380: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2390: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
23a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23b0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23c0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
23d0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
23e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
23f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2400: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2420: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
2430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2440: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
2450: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
2460: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
2470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
2480: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2490: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
24a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
24b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
24c0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
24d0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
24f0: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2500: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2510: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2530: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2540: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2550: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2560: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2570: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2580: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2590: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
25a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
25b0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
25c0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
25d0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
25e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
25f0: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2600: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2610: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2620: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2640: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2650: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2660: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2670: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
26a0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
26b0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26e0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
26f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2700: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2710: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2720: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2730: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
2740: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
2750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2760: 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74  argument nHeight
2770: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2780: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
2790: 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73  ximum.** express
27a0: 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65  ion depth allowe
27b0: 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  d. If it is not,
27c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27d0: 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50  message in.** pP
27e0: 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  arse..*/.int sql
27f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2800: 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ght(Parse *pPars
2810: 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b  e, int nHeight){
2820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48  TE_OK;.  int mxH
2840: 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e  eight = pParse->
2850: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2860: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
2870: 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67  TH];.  if( nHeig
2880: 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20  ht>mxHeight ){. 
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
28b0: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
28c0: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
28d0: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
28e0: 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20  %d)", mxHeight. 
28f0: 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53     );.    rc = S
2900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2920: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
2930: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
2940: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
2950: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
2960: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
2970: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
2980: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
2990: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
29a0: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
29b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
29c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
29d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29e0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
2a10: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
2a20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2a30: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
2a40: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
2a50: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
2a60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
2a70: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
2a80: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
2a90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2aa0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
2ab0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
2ac0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2ae0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
2af0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
2b00: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
2b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2b20: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
2b40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
2b50: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2b60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2b90: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2ba0: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
2bb0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
2bc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2bd0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2be0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
2bf0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2c00: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
2c10: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
2c20: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
2c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c40: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
2c50: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2c60: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
2c70: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2c80: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2c90: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
2ca0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2cb0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
2cc0: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
2cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2ce0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
2cf0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
2d20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
2d40: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
2d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d60: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
2d80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2d90: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
2da0: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
2db0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
2dc0: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
2dd0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
2de0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
2df0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
2e00: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
2e10: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
2e20: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
2e30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2e40: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
2e50: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
2e60: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
2e70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
2e80: 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65  ate EP_Propagate
2e90: 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45   flags up from E
2ea0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45  xpr.x.pList to E
2eb0: 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66  xpr.flags,.** if
2ec0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ee0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2f20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2f30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2f40: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2f50: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2f60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2f70: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2f80: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2f90: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2fa0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ight);.  }else i
2fb0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  f( p->x.pList ){
2fc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2fd0: 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74  rList(p->x.pList
2fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , &nHeight);.   
2ff0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
3000: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
3010: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
3020: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
3030: 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  }.  p->nHeight =
3040: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
3050: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
3060: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
3070: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65  able using the e
3080: 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66  xprSetHeight() f
3090: 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74  unction. If.** t
30a0: 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65  he height is gre
30b0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ater than the ma
30c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78  ximum allowed ex
30d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a  pression depth,.
30e0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
30f0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  r in pParse..**.
3100: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
3110: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
3120: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
3130: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
3140: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
3150: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
3160: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3170: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
3180: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
3190: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
31a0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
31b0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
31c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
31d0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
31e0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
3210: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
3220: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
3230: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
3240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3250: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
3260: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3270: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
3280: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
3290: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
32a0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
32b0: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
32c0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
32d0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f  eight;.}.#else /
32e0: 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74  * ABOVE:  Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61   enforcement ena
3300: 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65  bled.  BELOW: He
3310: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
3320: 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72   off */./*.** Pr
3330: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
3340: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
3350: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
3360: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
3370: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
3380: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
3390: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
33a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
33b0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
33c0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26  && p->x.pList &&
33d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
33e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
33f0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61  t) ){.    p->fla
3400: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3410: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
3420: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
3430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65  List);.  }.}.#de
3440: 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67  fine exprSetHeig
3450: 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ht(y).#endif /* 
3460: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3470: 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  DEPTH>0 */../*.*
3480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3490: 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63  s the core alloc
34a0: 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f  ator for Expr no
34b0: 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  des..**.** Const
34c0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
34d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
34e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34f0: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
3500: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
3510: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b  and for the pTok
3520: 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  en argument is a
3530: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
3540: 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  on.** obtained f
3550: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3560: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
3570: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
3580: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3590: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
35a0: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
35b0: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
35c0: 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  *.** If dequote 
35d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
35e0: 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65  e token (if it e
35f0: 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74  xists) is dequot
3600: 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  ed..** If dequot
3610: 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64  e is false, no d
3620: 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66  equoting is perf
3630: 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65  ormance.  The de
3640: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
3650: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
3660: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
3670: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
3680: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
3690: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
36a0: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
36b0: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
36c0: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
36d0: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
36e0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
36f0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
3700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
3710: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
3720: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
3730: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
3740: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
3750: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
3760: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
3770: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
3780: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
3790: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
37a0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
37b0: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
37c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
37d0: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
37e0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
37f0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
3800: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
3810: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
3820: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
3830: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
3840: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
3850: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
3860: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
3870: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3880: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
3890: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
38a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
38b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
38c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
38d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3900: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
3910: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
3920: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
3930: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
3940: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
3950: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
3960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
3970: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
3980: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
3990: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
39a0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
39b0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
39c0: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
39d0: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
39e0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
39f0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3a00: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3a10: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
3a20: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
3a30: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
3a40: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
3a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
3a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3a80: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a90: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3aa0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  {.    pNew->op =
3ab0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
3ac0: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3ad0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
3ae0: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
3af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3b00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3b10: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
3b20: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
3b30: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3b50: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
3b60: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
3b70: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3b80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3b90: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
3ba0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3bc0: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
3bd0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
3be0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
3bf0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
3c00: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
3c10: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
3c30: 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20  te && nExtra>=3 
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3c50: 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a   ((c = pToken->z
3c60: 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  [0])=='\'' || c=
3c70: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='"' || c=='[' |
3c80: 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20  | c=='`') ){.   
3c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
3ca0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
3cb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
3cc0: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e   if( c=='"' ) pN
3cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3ce0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
3cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d00: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3d10: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d20: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d70: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d80: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3da0: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3db0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3dc0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3df0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3e00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3e10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e60: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e90: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3ea0: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3eb0: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ec0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3ed0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ef0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3f10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3fa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3fb0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fc0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fe0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4000: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
4010: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4020: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4030: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4040: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4070: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4090: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
40a0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
40b0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40d0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40e0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40f0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
4100: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
4110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4120: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4130: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4140: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4150: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4160: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4170: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4180: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4190: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
41a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41b0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41c0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41d0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41e0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41f0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
4200: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
4210: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4220: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4230: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4240: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4250: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4260: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4270: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4280: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4290: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
42a0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
42b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42e0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4300: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4310: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4330: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4340: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4360: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4370: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4380: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4390: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
43a0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
43b0: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43c0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
43d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
4400: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4410: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4420: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4440: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4450: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4470: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4480: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
4490: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20  pToken, 1);.    
44a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
44b0: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
44c0: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
44d0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
44e0: 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c  f( p ) {.    sql
44f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
4500: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
4510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  Height);.  }.  r
4520: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4530: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4540: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4550: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4560: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4570: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4580: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4590: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
45a0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
45b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
45c0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
45d0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
45e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
45f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
4600: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
4610: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
4620: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
4630: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
4640: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4650: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4660: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4670: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4680: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4690: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
46a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
46b0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
46c0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
46d0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
46e0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
46f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
4700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4710: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
4720: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
4730: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
4740: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4750: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4760: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4770: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4780: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4790: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
47b0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
47c0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
47d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
47e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
47f0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
4800: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
4810: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
4820: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
4830: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
4840: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4850: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4860: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4870: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4890: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
48a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
48b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
48c0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
48d0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
48e0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
48f0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4900: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4910: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4930: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4950: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4960: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4970: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4980: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4990: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
49a0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
49b0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
49c0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
49d0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
49e0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
49f0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4a00: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4a40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4a50: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4a70: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4a80: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4a90: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4ab0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4ac0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4ad0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4af0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4b10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4b20: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b40: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4b50: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4b60: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4b70: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4b90: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4ba0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4bb0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4bc0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4bd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4be0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4bf0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4c00: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4c10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4c20: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4c30: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4c40: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4c50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4c60: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4c70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4c80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4c90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4ca0: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4cd0: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4ce0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4cf0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4d00: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4d10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4d30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4d40: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4d50: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4d60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d80: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4d90: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4da0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4db0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4dc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4dd0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4de0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4df0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4e00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4e10: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4e20: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4e30: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4e40: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4e50: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4e60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4e70: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
4e80: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
4e90: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
4ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4eb0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
4ec0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
4ed0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4ee0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4ef0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4f00: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4f10: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4f20: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4f30: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4f40: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4f50: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4f60: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4f70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
4f80: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
4f90: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
4fa0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4fb0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
4fc0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
4fd0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4fe0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4ff0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
5000: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5010: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
5020: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
5030: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
5040: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5050: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5060: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5070: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5080: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5090: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
50a0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
50b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
50c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
50d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50e0: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
50f0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
5100: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
5110: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5130: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
5140: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5150: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5160: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5190: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
51a0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
51b0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
51c0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
51d0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
51e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
51f0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
5200: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
5210: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5220: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
5230: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
5240: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5250: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5260: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5270: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5280: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5290: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
52a0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
52b0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
52c0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
52d0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
52e0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
52f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
5300: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
5310: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
5320: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
5330: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
5340: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5350: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5360: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5370: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5390: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
53a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
53b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53d0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
53e0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
53f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5410: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
5420: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
5430: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
5440: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5450: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5480: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5490: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
54a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
54b0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
54c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
54d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
54e0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
54f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5500: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
5510: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
5520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
5530: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5560: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5570: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5580: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5590: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
55a0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
55b0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
55c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
55d0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
55e0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
55f0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
5600: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
5610: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
5620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5630: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
5640: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5650: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5660: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5670: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5680: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5690: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
56a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
56b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
56c0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
56d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56f0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
5700: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
5710: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
5720: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
5730: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5750: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5760: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5780: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5790: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
57a0: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
57b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
57c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
57d0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
57e0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
57f0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
5800: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
5810: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5820: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5830: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5840: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5850: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5870: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5880: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5890: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
58a0: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
58c0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
58e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
58f0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
5900: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5910: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5920: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5930: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5940: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5950: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5960: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5970: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
59a0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
59b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
59c0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
59d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
59e0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
59f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5a10: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5a30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5a40: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5a50: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5a60: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5a70: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a90: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5aa0: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5ab0: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
5ac0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ad0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
5af0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
5b00: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
5b10: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
5b20: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
5b30: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
5b40: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
5b50: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ht==0 );.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
5b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5b90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
5ba0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5bb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bc0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
5bd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5be0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
5bf0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
5c20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5c30: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
5c40: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
5c50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5c60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5c70: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ca0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5cc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5cf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5d20: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5d40: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5d50: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5d60: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5d70: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5d80: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5d90: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5da0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5dc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5dd0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5de0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5df0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5e20: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5e30: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5e40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5e60: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5e70: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5e90: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5ea0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5eb0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5ec0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5ed0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5ee0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5ef0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5f00: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5f10: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5f20: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5f30: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5f40: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5f50: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5f60: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5f70: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5f80: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5f90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5fa0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5fb0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5fc0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5fd0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
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 2a  ****************
6020: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
6030: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6040: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
6050: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
6060: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
6070: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
6080: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
6090: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
60a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
60b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
60c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
60d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
60e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
60f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
6100: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
6110: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
6120: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
6130: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
6140: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
6150: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
6160: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
6170: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6180: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
61a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
61b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
61c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
61d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
61e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
61f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
6200: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
6210: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
6220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
6230: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
6240: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
6250: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
6260: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
6270: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
6280: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
6290: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
62a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
62b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
62c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
62d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
62e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
62f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
6300: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
6310: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
6320: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
6330: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
6340: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
6350: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
6360: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
6370: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
6380: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
63a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
63b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
63c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
63d0: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
63e0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
63f0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
6400: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
6410: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
6420: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
6430: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
6440: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
6450: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
6460: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
6470: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
6480: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
6490: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
64a0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
64b0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
64c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
64d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
64e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
64f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6500: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
6510: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
6520: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6530: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
6540: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
6550: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
6560: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
6570: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
6580: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
6590: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
65a0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
65b0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
65c0: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
65d0: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
65e0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
65f0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
6600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
6610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6620: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
6630: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
6640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6650: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6660: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
6670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6690: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
66b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66c0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
66d0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
66e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
66f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6730: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
6740: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
6750: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
6760: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
6770: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
6790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
67a0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
67b0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
67c0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
67d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
67e0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
67f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
6800: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
6810: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
6820: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
6830: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6850: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6860: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6870: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6880: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6890: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
68a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
68b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
68c0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
68d0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
68e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
6910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
6920: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
6930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6940: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6950: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
6960: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
6970: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
6980: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
6990: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
69a0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
69b0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
69c0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
69d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
69f0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
6a00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
6a10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
6a20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
6a30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
6a40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
6a50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
6a60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
6a70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
6a80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
6a90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
6aa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
6ab0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
6ac0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
6ad0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
6ae0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
6af0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
6b00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
6b10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
6b20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
6b30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
6b40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
6b50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
6b60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
6b70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
6b80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
6b90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
6ba0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6bb0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6bc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
6bd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
6be0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6bf0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6c00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
6c10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
6c20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
6c30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
6c40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
6c50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
6c60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
6c70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
6c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6ca0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
6cb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
6cc0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
6cd0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
6ce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
6cf0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
6d00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
6d20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
6d30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
6d40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
6d50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
6d60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
6d70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
6d80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
6d90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
6da0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
6db0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
6dc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
6dd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
6de0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6df0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
6e00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
6e10: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
6e20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
6e40: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
6e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
6e60: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
6e70: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
6e80: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
6eb0: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
6ec0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
6ed0: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
6ee0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6ef0: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
6f00: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
6f10: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
6f20: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
6f30: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
6f40: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
6f50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
6f60: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
6f70: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
6f80: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
6f90: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
6fa0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
6fb0: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
6fc0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6fe0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
6ff0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
7000: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7010: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
7020: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
7030: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
7040: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7050: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
7060: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
7070: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
7080: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
7090: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
70a0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
70b0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
70c0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
70d0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
70e0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
70f0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
7100: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7110: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
7120: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
7130: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
7140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
7150: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
7160: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
7170: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
7180: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
7190: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
71b0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
71c0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
71d0: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
71e0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
71f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7200: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
7210: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
7220: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
7230: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7240: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7250: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
7270: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
7280: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
7290: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
72a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
72b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
72c0: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
72d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
72e0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
72f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
7310: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
7320: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7330: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
7340: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
7350: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7360: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7370: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7380: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7390: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
73a0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
73b0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
73c0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
73d0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
73e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
73f0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7400: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
7410: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
7420: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
7430: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
7440: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
7450: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
7460: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7470: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7480: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7490: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
74a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
74b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
74c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
74d0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
74e0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
74f0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7500: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
7510: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
7520: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
7530: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
7540: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
7550: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
7560: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7580: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7590: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
75a0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
75b0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
75c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
75d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
75e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
75f0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7600: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7610: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7620: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
7630: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
7640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7650: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
7660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7670: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7680: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76a0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
76b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
76c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
76d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
76e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
76f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7710: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7720: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7730: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
7740: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7750: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7760: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7780: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7790: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
77a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
77b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
77c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
77d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
77e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
77f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7810: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7860: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7870: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7890: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
78d0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7920: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7930: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7940: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7950: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7960: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7970: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7980: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7990: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
79a0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
79b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
79c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79d0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7a00: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7a10: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7a20: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7a30: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7a40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7a50: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7a60: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7a70: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7a80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7a90: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7aa0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7ab0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7ac0: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7ad0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7af0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7b00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7b10: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7b20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7b30: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7b50: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7b80: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7b90: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7ba0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7bb0: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7bc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7be0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7bf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7c00: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7c10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7c20: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7c30: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7c40: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7c50: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7c60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7c70: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7c90: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7ca0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7cb0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7cc0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7cd0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7ce0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7cf0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7d00: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7d10: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7d20: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7d30: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7d40: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7d50: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7d60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7d70: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
7d80: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
7d90: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
7da0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
7db0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
7dc0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
7dd0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
7de0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
7df0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
7e00: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
7e10: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
7e20: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
7e30: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
7e40: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
7e50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
7e60: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
7e70: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
7e80: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
7e90: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
7ea0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
7eb0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
7ec0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
7ed0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
7ee0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
7ef0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
7f00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
7f10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
7f20: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7f30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
7f40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7f50: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
7f60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
7f70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
7f80: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
7f90: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
7fa0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7fb0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
7fc0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
7fd0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7fe0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
7ff0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8000: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8010: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
8020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8050: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8060: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8090: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
80a0: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
80b0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
80c0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
80d0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
80e0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
80f0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8120: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8130: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8150: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8160: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8170: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8190: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
81a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
81b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
81c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
81d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
81e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
81f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8200: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8210: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8240: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8250: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8270: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8280: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8290: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
82a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
82b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
82d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
82e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
82f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8300: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8330: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8340: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8350: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8360: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8370: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8390: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
83a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
83b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
83c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
83d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
83e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
83f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8400: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8410: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8420: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8430: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8440: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8450: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8470: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
84a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
84b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
84c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
84d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
84e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
84f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8500: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
8510: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
8520: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
8530: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
8540: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8550: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
8560: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8580: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8590: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
85a0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
85b0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
85c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
85d0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
85e0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
85f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8600: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8610: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8640: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8650: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8660: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8670: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8690: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
86a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
86b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
86c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
86e0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
86f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8700: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8710: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8720: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
8730: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
8740: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
8750: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
8760: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
8770: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
8780: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
8790: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
87a0: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
87b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
87c0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
87d0: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
87e0: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
87f0: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
8800: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
8810: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8820: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
8830: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
8840: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
8850: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
8860: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
8870: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
8880: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
8890: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
88a0: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
88b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
88c0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
88d0: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
88e0: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
88f0: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
8900: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
8910: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
8920: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
8930: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
8940: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
8950: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
8960: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8970: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8980: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
8990: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
89a0: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
89b0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
89c0: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
89d0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
89e0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
89f0: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
8a00: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
8a10: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
8a20: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
8a30: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
8a40: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
8a50: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
8a60: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
8a70: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
8a80: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
8a90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
8aa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8ab0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8ac0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8ad0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
8ae0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8af0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8b00: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
8b10: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
8b20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8b30: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
8b40: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
8b50: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
8b60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
8b70: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
8b80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8b90: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
8ba0: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
8bb0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
8bc0: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
8bd0: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
8be0: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
8bf0: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
8c00: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
8c10: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
8c20: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
8c30: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
8c40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
8c50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
8c60: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
8c70: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
8c80: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
8c90: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
8ca0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
8cb0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
8cc0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
8cd0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
8ce0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8cf0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
8d00: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
8d10: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
8d20: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
8d30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
8d40: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
8d50: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
8d60: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
8d70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65  t flags){.  Sele
8d80: 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f  ct *pNew, *pPrio
8d90: 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  r;.  if( p==0 ) 
8da0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8db0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8dc0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8dd0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
8de0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
8df0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
8e00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8e10: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
8e20: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
8e30: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
8e40: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
8e50: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
8e60: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
8e70: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
8e80: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
8e90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8ea0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
8eb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8ec0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
8ed0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8ee0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
8ef0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8f00: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
8f10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
8f20: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
8f30: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
8f40: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
8f50: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
8f60: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
8f70: 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73  ior = pPrior = s
8f80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
8f90: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66  db, p->pPrior, f
8fa0: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72  lags);.  if( pPr
8fb0: 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
8fc0: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
8fd0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
8fe0: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
8ff0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9000: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c  b, p->pLimit, fl
9010: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
9020: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
9030: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
9040: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
9050: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
9060: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
9070: 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  et = 0;.  pNew->
9080: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
9090: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
90a0: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e  sEphemeral;.  pN
90b0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
90c0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
90d0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
90e0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
90f0: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e  nSelectRow = p->
9100: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e  nSelectRow;.  pN
9110: 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68  ew->pWith = with
9120: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  Dup(db, p->pWith
9130: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
9140: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
9150: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
9160: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
9170: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
9180: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
9190: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
91a0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
91b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
91c0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
91d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
91e0: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
91f0: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
9200: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
9210: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
9220: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
9230: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
9240: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
9250: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
9260: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9270: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
9280: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
9290: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
92a0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
92b0: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
92c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
92d0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
92e0: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
92f0: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
9300: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
9310: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
9320: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
9330: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
9340: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9350: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9360: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9370: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
9380: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
9390: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
93a0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
93b0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
93c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
93d0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
93e0: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
93f0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
9400: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9410: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
9420: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
9430: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
9440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
9450: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
9460: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
9470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
9480: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
9490: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
94a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
94b0: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69  w(db, sizeof(pLi
94c0: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
94d0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20  if( pList->a==0 
94e0: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
94f0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
9500: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
9510: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
9520: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9530: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
9540: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
9550: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
9560: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
9570: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
9580: 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ->a, pList->nExp
9590: 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  r*2*sizeof(pList
95a0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
95b0: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
95c0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
95d0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
95e0: 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = a;.  }.  asser
95f0: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
9600: 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20  ;.  if( 1 ){.   
9610: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9620: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
9630: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
9640: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
9650: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
9660: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
9670: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
9680: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
9690: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
96a0: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
96b0: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
96c0: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
96d0: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
96e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
96f0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
9700: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9710: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
9720: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
9730: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9740: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61  ExprList.a[].zNa
9750: 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  me element of th
9760: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9770: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
9780: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9790: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
97a0: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
97b0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
97c0: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61   error.  But pNa
97d0: 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  me should never 
97e0: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
97f0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
9800: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
9810: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9820: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
9830: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
9840: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
9850: 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  etName(.  Parse 
9860: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9870: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9880: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9890: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
98a0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
98b0: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
98c0: 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  an. */.  Token *
98d0: 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
98e0: 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61   /* Name to be a
98f0: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  dded */.  int de
9900: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
9910: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75    /* True to cau
9920: 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62  se the name to b
9930: 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  e dequoted */.){
9940: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9950: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
9960: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
9970: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
9980: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
9990: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
99a0: 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
99b0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
99c0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
99d0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
99e0: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
99f0: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
9a00: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  ame==0 );.    pI
9a10: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
9a20: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50  ite3DbStrNDup(pP
9a30: 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d  arse->db, pName-
9a40: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
9a50: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
9a60: 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
9a70: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
9a80: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
9a90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
9aa0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
9ab0: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
9ac0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9ad0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
9ae0: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
9af0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9b00: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
9b10: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
9b20: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
9b30: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
9b40: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
9b50: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9b60: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
9b70: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
9b80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
9b90: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
9ba0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9bb0: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
9bc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9bd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9be0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9bf0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9c00: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
9c10: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
9c20: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70  e span. */.  Exp
9c30: 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20  rSpan *pSpan    
9c40: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e       /* The span
9c50: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
9c60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9c70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9c80: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
9c90: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
9ca0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
9cb0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
9cc0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9cd0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
9ce0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9cf0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
9d00: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
9d10: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
9d20: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9d30: 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78  ed || pItem->pEx
9d40: 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72  pr==pSpan->pExpr
9d50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
9d60: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
9d70: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
9d80: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
9d90: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
9da0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
9db0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
9de0: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
9df0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
9e00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
9e10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
9e20: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
9e30: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
9e40: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
9e50: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
9e60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
9e70: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
9e80: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
9e90: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
9ea0: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
9eb0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
9ec0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
9ed0: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
9ee0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
9ef0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
9f00: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
9f10: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
9f20: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
9f30: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
9f40: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
9f50: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
9f60: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
9f70: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
9f80: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
9f90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9fa0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
9fb0: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
9fc0: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
9fd0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
9fe0: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
9ff0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
a000: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a010: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
a020: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
a030: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
a040: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a050: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
a060: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
a070: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
a080: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73  st->a!=0 || pLis
a090: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20  t->nExpr==0 );. 
a0a0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
a0b0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
a0c0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
a0d0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
a0e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a0f0: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
a100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
a110: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
a120: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
a130: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a140: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
a150: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a160: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
a170: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a180: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
a190: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
a1a0: 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c  itwise-OR of all
a1b0: 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
a1c0: 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a  ds in the given.
a1d0: 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  ** ExprList..*/.
a1e0: 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c  u32 sqlite3ExprL
a1f0: 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45  istFlags(const E
a200: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
a210: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20  .  int i;.  u32 
a220: 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  m = 0;.  if( pLi
a230: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
a240: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
a250: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
a260: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
a270: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
a280: 0a 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  .       if( ALWA
a290: 59 53 28 70 45 78 70 72 29 20 29 20 6d 20 7c 3d  YS(pExpr) ) m |=
a2a0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
a2b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a2c0: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
a2d0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
a2e0: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
a2f0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
a300: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
a310: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
a320: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
a330: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
a340: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
a350: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
a360: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
a370: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
a380: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
a390: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
a3a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
a3b0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
a3c0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
a3d0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
a3e0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
a3f0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a400: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
a410: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a420: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
a430: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
a440: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
a450: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
a460: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
a470: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
a480: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
a490: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
a4a0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
a4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a4c0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
a4d0: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
a4e0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
a4f0: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
a500: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
a510: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
a520: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
a530: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
a540: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
a550: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
a560: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
a570: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
a580: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a590: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
a5a0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
a5b0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
a5c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a5d0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
a5e0: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
a5f0: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
a600: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
a610: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
a620: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
a630: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
a640: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
a650: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
a660: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
a670: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
a680: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
a690: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
a6a0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
a6b0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
a6c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a6d0: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
a6e0: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
a6f0: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
a700: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
a710: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
a720: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
a730: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
a740: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
a750: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
a760: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
a770: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
a780: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
a790: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
a7a0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
a7b0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
a7c0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
a7d0: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
a7e0: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
a7f0: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
a800: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
a810: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
a820: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
a830: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
a840: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
a850: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
a860: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
a870: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
a880: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
a890: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
a8a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
a8b0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
a8c0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
a8d0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
a8e0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
a8f0: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
a900: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
a910: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
a920: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
a930: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
a940: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
a950: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
a960: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
a970: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a980: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
a990: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
a9a0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
a9b0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
a9c0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
a9d0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
a9e0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
a9f0: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
aa00: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
aa10: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
aa20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
aa30: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
aa40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa50: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
aa60: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
aa70: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
aa80: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
aa90: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
aaa0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
aab0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
aac0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
aad0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
aae0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
aaf0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
ab00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ab10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
ab20: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
ab30: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
ab40: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
ab50: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
ab60: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ab70: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
ab80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
ab90: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
aba0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
abb0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
abc0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
abd0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
abe0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
abf0: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ac00: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
ac10: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ac20: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
ac30: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
ac40: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
ac50: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
ac60: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
ac70: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
ac80: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
ac90: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
aca0: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
acb0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
acc0: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
acd0: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
ace0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
acf0: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
ad00: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
ad10: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
ad20: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
ad30: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
ad40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
ad50: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
ad60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
ad70: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
ad80: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
ad90: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
ada0: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
adb0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
adc0: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
add0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
ade0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
adf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
ae00: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ae10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
ae20: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
ae30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
ae40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ae50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
ae60: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
ae70: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
ae80: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
ae90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
aea0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
aeb0: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
aec0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
aed0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
aee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
aef0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
af00: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
af10: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
af20: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
af30: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
af40: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
af50: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
af60: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
af70: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
af80: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
af90: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
afa0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
afb0: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
afc0: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
afd0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
afe0: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
aff0: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
b000: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
b010: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
b020: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
b030: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
b040: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
b050: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
b060: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
b070: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
b080: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
b090: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
b0a0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b0b0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b0c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b0d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b0e0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
b0f0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
b100: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
b110: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
b120: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
b130: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
b140: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
b150: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b160: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
b170: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
b180: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
b190: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
b1a0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
b1b0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
b1c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b1d0: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
b1e0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
b1f0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
b200: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
b210: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b220: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b230: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b240: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b250: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
b260: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
b270: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
b280: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
b290: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
b2a0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
b2b0: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
b2c0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
b2d0: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
b2e0: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
b2f0: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
b300: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b310: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
b320: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
b330: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
b340: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
b350: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
b360: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
b370: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
b380: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
b390: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
b3a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
b3b0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
b3c0: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
b3d0: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
b3e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
b3f0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
b400: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
b410: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
b420: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
b430: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
b440: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b450: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
b460: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
b470: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
b480: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
b490: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
b4a0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b4b0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b4c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b4d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b4e0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
b4f0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
b500: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
b510: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
b520: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
b530: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
b540: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
b550: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
b560: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
b570: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
b580: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
b590: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b5a0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
b5b0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
b5c0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
b5d0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
b5e0: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
b5f0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
b600: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
b610: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
b620: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
b630: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
b640: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
b650: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
b660: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  sInit, 0);.}../*
b670: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
b680: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
b690: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
b6a0: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
b6b0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
b6c0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
b6d0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
b6e0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
b6f0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
b700: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
b710: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b720: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
b730: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
b740: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
b750: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
b760: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
b770: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
b780: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
b790: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b7a0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
b7b0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
b7c0: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
b7d0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   0;..  /* If an 
b7e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
b7f0: 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c   integer literal
b800: 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20   that fits in a 
b810: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20  signed 32-bit.  
b820: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  ** integer, then
b830: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
b840: 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20   flag will have 
b850: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74  already been set
b860: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b870: 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op!=TK_INTEGER 
b880: 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45  || (p->flags & E
b890: 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20  P_IntValue)!=0. 
b8a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
b8b0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
b8c0: 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d  u.zToken, &rc)==
b8d0: 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66  0 );..  if( p->f
b8e0: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
b8f0: 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75  ue ){.    *pValu
b900: 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b  e = p->u.iValue;
b910: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b920: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
b930: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
b940: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
b950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
b960: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
b970: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
b980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b990: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
b9a0: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
b9b0: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
b9c0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
b9d0: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
b9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b9f0: 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33  rt( v!=(-2147483
ba00: 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  647-1) );.      
ba10: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
ba20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ba40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
ba50: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
ba60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ba70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ba80: 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69  FALSE if there i
ba90: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
baa0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bab0: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  can be NULL..**.
bac0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
bad0: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55  sion might be NU
bae0: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70  LL or if the exp
baf0: 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63  ression is too c
bb00: 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c  omplex.** to tel
bb10: 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  l return TRUE.  
bb20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bb30: 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61  ine is used as a
bb40: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
bb50: 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c  to skip OP_IsNul
bb60: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65  l opcodes.** whe
bb70: 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  n we know that a
bb80: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
bb90: 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61   NULL.  Hence, a
bba0: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a   false positive.
bbb0: 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52  ** (returning TR
bbc0: 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20  UE when in fact 
bbd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
bbe0: 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c  an never be NULL
bbf0: 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  ) might.** be a 
bc00: 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63  small performanc
bc10: 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68  e hit but is oth
bc20: 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e  erwise harmless.
bc30: 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a    On the other.*
bc40: 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20  * hand, a false 
bc50: 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e  negative (return
bc60: 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74  ing FALSE when t
bc70: 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20  he result could 
bc80: 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c  be NULL).** will
bc90: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
bca0: 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61  n an incorrect a
bcb0: 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20  nswer.  So when 
bcc0: 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
bcd0: 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74  .** TRUE..*/.int
bce0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
bcf0: 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72  eNull(const Expr
bd00: 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20   *p){.  u8 op;. 
bd10: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
bd20: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
bd30: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
bd40: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
bd50: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
bd60: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
bd70: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
bd80: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
bd90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
bda0: 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
bdb0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
bdc0: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
bdd0: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
bde0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
bdf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
be00: 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  MN:.      assert
be10: 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  ( p->pTab!=0 );.
be20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70        return Exp
be30: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
be40: 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c  EP_CanBeNull) ||
be50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
be60: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
be70: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d  p->pTab->aCol[p-
be80: 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c  >iColumn].notNul
be90: 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75  l==0);.    defau
bea0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
beb0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
bec0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
bed0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
bee0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61  sion is a consta
bef0: 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  nt which would b
bf00: 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62  e.** unchanged b
bf10: 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69  y OP_Affinity wi
bf20: 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  th the affinity 
bf30: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63  given in the sec
bf40: 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ond.** argument.
bf50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bf60: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
bf70: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
bf80: 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72  OP_Affinity oper
bf90: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
bfa0: 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69  omitted.  When i
bfb0: 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46  n doubt return F
bfc0: 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e  ALSE.  A false n
bfd0: 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61  egative.** is ha
bfe0: 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65  rmless.  A false
bff0: 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76   positive, howev
c000: 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69  er, can result i
c010: 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61  n the wrong.** a
c020: 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nswer..*/.int sq
c030: 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
c040: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63  AffinityChange(c
c050: 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68  onst Expr *p, ch
c060: 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70  ar aff){.  u8 op
c070: 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  ;.  if( aff==SQL
c080: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72  ITE_AFF_BLOB ) r
c090: 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65  eturn 1;.  while
c0a0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
c0b0: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
c0c0: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
c0d0: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
c0e0: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
c0f0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
c100: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
c110: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
c120: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
c130: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
c140: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c150: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
c160: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c170: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
c180: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
c190: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
c1a0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
c1b0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
c1c0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
c1d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
c1e0: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72  TRING: {.      r
c1f0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
c200: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
c210: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  }.    case TK_BL
c220: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  OB: {.      retu
c230: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
c240: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
c250: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c260: 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20  p->iTable>=0 ); 
c270: 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20   /* p cannot be 
c280: 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20  part of a CHECK 
c290: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
c2a0: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
c2b0: 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20  olumn<0.        
c2c0: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
c2d0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
c2e0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
c2f0: 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d  _NUMERIC);.    }
c300: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
c310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
c320: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c330: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
c340: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
c350: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
c360: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69  olumn name..*/.i
c370: 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  nt sqlite3IsRowi
c380: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  d(const char *z)
c390: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  {.  if( sqlite3S
c3a0: 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49  trICmp(z, "_ROWI
c3b0: 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  D_")==0 ) return
c3c0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
c3d0: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  3StrICmp(z, "ROW
c3e0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
c3f0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
c400: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44  3StrICmp(z, "OID
c410: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
c420: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
c430: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
c440: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  ue if we are abl
c450: 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72  e to the IN oper
c460: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
c470: 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20  n on a.** query 
c480: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
c490: 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  *       x IN (SE
c4a0: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
c4b0: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
c4c0: 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73  ... clause is as
c4d0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
c4e0: 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  e parameter to t
c4f0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  his.** routine..
c500: 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74  **.** The Select
c510: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   object passed i
c520: 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
c530: 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64 20  en preprocessed 
c540: 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73  and no.** errors
c550: 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64   have been found
c560: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
c570: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c580: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
c590: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
c5a0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
c5b0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
c5c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c5d0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
c5e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
c5f0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
c600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
c610: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
c620: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
c630: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
c640: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
c660: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
c670: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
c680: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
c690: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
c6a0: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
c6b0: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
c6c0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
c6d0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
c6e0: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
c6f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
c700: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
c710: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
c720: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
c730: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
c740: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
c750: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
c760: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
c770: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
c780: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
c790: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
c7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
c7b0: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
c7c0: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
c7d0: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
c7e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c7f0: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
c800: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
c810: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
c820: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
c830: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
c840: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
c850: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
c860: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
c870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
c880: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
c890: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
c8a0: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
c8b0: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
c8c0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
c8d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c8e0: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
c8f0: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
c900: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
c910: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
c920: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
c930: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
c940: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
c950: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
c960: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
c970: 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d  if( NEVER(pTab==
c980: 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
c990: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
c9a0: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20  Select==0 );    
c9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
c9c0: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20  clause is not a 
c9d0: 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73  view */.  if( Is
c9e0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
c9f0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ca00: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
ca10: 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
ca20: 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  ble */.  pEList 
ca30: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
ca40: 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
ca50: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
ca60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c        /* One col
ca70: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
ca80: 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70  t set */.  if( p
ca90: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
caa0: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
cab0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
cac0: 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75  Result is a colu
cad0: 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  mn */.  return 1
cae0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
caf0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
cb00: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  RY */../*.** Cod
cb10: 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  e an OP_Once ins
cb20: 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c  truction and all
cb30: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
cb40: 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e  its flag. Return
cb50: 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73   the .** address
cb60: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
cb70: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ruction..*/.int 
cb80: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
cb90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
cba0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
cbb0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
cbc0: 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74  e);      /* Virt
cbd0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
cbe0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74  g coded */.  ret
cbf0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
cc00: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp1(v, OP_Once
cc10: 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b  , pParse->nOnce+
cc20: 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  +);.}../*.** Gen
cc30: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
cc40: 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d  checks the left-
cc50: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  most column of i
cc60: 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20  ndex table iCur 
cc70: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20  to see if.** it 
cc80: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
cc90: 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73  L entries.  Caus
cca0: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61  e the register a
ccb0: 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20  t regHasNull to 
ccc0: 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e  be set.** to a n
ccd0: 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
cce0: 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e   iCur contains n
ccf0: 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20  o NULLs.  Cause 
cd00: 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e  register regHasN
cd10: 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74  ull.** to be set
cd20: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72   to NULL if iCur
cd30: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
cd40: 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
cd50: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
cd60: 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e  d sqlite3SetHasN
cd70: 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c  ullFlag(Vdbe *v,
cd80: 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72   int iCur, int r
cd90: 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e  egHasNull){.  in
cda0: 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74 65 33 56  t j1;.  sqlite3V
cdb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cdc0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48  Integer, 0, regH
cdd0: 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20 3d 20  asNull);.  j1 = 
cde0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cdf0: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
ce00: 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
ce10: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
ce20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ce30: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
ce40: 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
ce50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ce60: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
ce70: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
ce80: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
ce90: 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
cea0: 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
ceb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cec0: 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a 23 69  e(v, j1);.}...#i
ced0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cee0: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
cef0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
cf00: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
cf10: 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
cf20: 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
cf30: 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
cf40: 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
cf50: 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
cf60: 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
cf70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
cf80: 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
cf90: 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
cfa0: 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
cfb0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
cfc0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
cfd0: 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
cfe0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
cff0: 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
d000: 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
d010: 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
d020: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
d030: 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
d040: 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
d050: 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
d060: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
d070: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
d080: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
d090: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
d0a0: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
d0b0: 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
d0c0: 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
d0d0: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
d0e0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d0f0: 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
d100: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
d110: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d120: 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
d130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
d140: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
d150: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
d160: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
d170: 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
d180: 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
d190: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
d1a0: 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
d1b0: 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
d1c0: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
d1d0: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
d1e0: 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
d1f0: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
d200: 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
d210: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
d220: 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
d230: 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
d240: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d250: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
d260: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
d270: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
d280: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
d290: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
d2a0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
d2b0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
d2c0: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
d2d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
d2e0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
d2f0: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
d300: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d310: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
d320: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
d330: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
d340: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
d350: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
d360: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
d370: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
d380: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
d390: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
d3a0: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
d3b0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
d3c0: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
d3d0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
d3e0: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
d3f0: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
d420: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
d430: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
d440: 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
d450: 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
d460: 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
d470: 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
d480: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d490: 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
d4a0: 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
d4b0: 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
d4c0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
d4d0: 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
d4e0: 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
d4f0: 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
d500: 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
d510: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
d520: 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
d530: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
d540: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
d550: 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
d560: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d570: 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
d580: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
d590: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
d5a0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
d5b0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
d5c0: 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
d5d0: 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
d5e0: 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
d5f0: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
d600: 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
d610: 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
d620: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
d630: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
d640: 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
d650: 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
d660: 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
d670: 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
d680: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
d690: 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
d6a0: 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
d6b0: 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
d6c0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
d6d0: 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
d6e0: 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
d6f0: 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
d700: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
d710: 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
d720: 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
d730: 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
d740: 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
d750: 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
d760: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
d770: 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
d780: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
d790: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
d7a0: 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
d7b0: 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
d7c0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
d7d0: 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
d7e0: 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
d7f0: 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
d800: 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
d810: 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
d820: 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
d830: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
d840: 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
d850: 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20  lected <column> 
d860: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
d870: 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
d880: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
d890: 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
d8a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69  PRIMARY KEY or i
d8b0: 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55  t.** has a UNIQU
d8c0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
d8d0: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a  UNIQUE index..**
d8e0: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
d8f0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
d900: 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
d910: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
d920: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
d930: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
d940: 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
d950: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
d960: 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
d970: 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  less <column> is
d980: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d990: 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e  ARY KEY or an in
d9a0: 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66  dex can .** be f
d9b0: 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d  ound with <colum
d9c0: 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  n> as its left-m
d9d0: 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  ost column..**.*
d9e0: 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
d9f0: 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
da00: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
da10: 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
da20: 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
da30: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
da40: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
da50: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
da60: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
da70: 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
da80: 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
da90: 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
daa0: 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
dab0: 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
dac0: 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
dad0: 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
dae0: 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
daf0: 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
db00: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
db10: 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
db20: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
db30: 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
db40: 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
db50: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
db60: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
db70: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
db80: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
db90: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
dba0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
dbb0: 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
dbc0: 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
dbd0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
dbe0: 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
dbf0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
dc00: 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
dc10: 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
dc20: 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
dc30: 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
dc40: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
dc50: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
dc60: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
dc70: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
dc80: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
dc90: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
dca0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
dcb0: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
dcc0: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
dcd0: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
dce0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
dcf0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
dd00: 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
dd10: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
dd20: 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
dd30: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
dd40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
dd50: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
dd60: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
dd70: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
dd80: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
dd90: 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
dda0: 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
ddb0: 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
ddc0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
ddd0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
dde0: 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
ddf0: 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
de00: 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
de10: 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
de20: 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
de30: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
de40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
de50: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
de60: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
de70: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
de80: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75  rse, Expr *pX, u
de90: 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20  32 inFlags, int 
dea0: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a  *prRhsHasNull){.
deb0: 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
dee0: 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
def0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
df00: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
df10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
df30: 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
df40: 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
df50: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
df60: 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
df70: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
df80: 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
df90: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
dfa0: 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
dfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
dfc0: 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
dfd0: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
dfe0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
dff0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
e000: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
e010: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
e020: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
e030: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
e040: 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65  ;.  mustBeUnique
e050: 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e   = (inFlags & IN
e060: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b  _INDEX_LOOP)!=0;
e070: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
e080: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
e090: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
e0a0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
e0b0: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
e0c0: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
e0d0: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
e0e0: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
e0f0: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
e100: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70   table..  */.  p
e110: 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70 65   = (ExprHasPrope
e120: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
e130: 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53  lect) ? pX->x.pS
e140: 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66  elect : 0);.  if
e150: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
e160: 30 20 26 26 20 69 73 43 61 6e 64 69 64 61 74 65  0 && isCandidate
e170: 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20  ForInOpt(p) ){. 
e180: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
e190: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
e1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e1b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e1c0: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
e1d0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1f0: 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e  * Table <table>.
e200: 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45   */.    Expr *pE
e210: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e230: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f  * Expression <co
e240: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36  lumn> */.    i16
e250: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
e280: 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  column <column> 
e290: 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20  */.    i16 iDb; 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e2c0: 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66 6f   Database idx fo
e2d0: 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61  r pTab */..    a
e2e0: 73 73 65 72 74 28 20 70 20 29 3b 20 20 20 20 20  ssert( p );     
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
e310: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e320: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
e330: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e340: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
e350: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
e360: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e370: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
e380: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e390: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
e3a0: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66  ); /* Because of
e3b0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e3c0: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61  nOpt(p) */.    a
e3d0: 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
e3e0: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
e3f0: 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66     /* Because of
e400: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
e410: 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70  nOpt(p) */.    p
e420: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
e430: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45  [0].pTab;.    pE
e440: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
e450: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
e460: 20 69 43 6f 6c 20 3d 20 28 69 31 36 29 70 45 78   iCol = (i16)pEx
e470: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
e480: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20  .    /* Code an 
e490: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61  OP_Transaction a
e4a0: 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  nd OP_TableLock 
e4b0: 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  for <table>. */.
e4c0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e4d0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
e4e0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
e4f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
e500: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
e510: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
e520: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
e530: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
e540: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
e550: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
e560: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
e570: 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
e580: 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73   from two places
e590: 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20  . In both cases 
e5a0: 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20  the vdbe.    ** 
e5b0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
e5c0: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61   allocated. So a
e5d0: 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74  ssume sqlite3Get
e5e0: 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73  Vdbe() is always
e5f0: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
e600: 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ul here..    */.
e610: 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20      assert(v);. 
e620: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
e630: 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
e640: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
e650: 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ce(pParse);.    
e660: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
e670: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
e680: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
e690: 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
e6a0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
e6b0: 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
e6c0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
e6d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e6e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
e6f0: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
e700: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
e710: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
e720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e730: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
e740: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
e750: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
e760: 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65  ence used by the
e770: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20   comparison. If 
e780: 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20  an index is to. 
e790: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
e7a0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
e7b0: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
e7c0: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
e7d0: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
e7e0: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
e7f0: 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  n sequence.  */.
e800: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
e810: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
e820: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
e830: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
e840: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
e850: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
e860: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
e870: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
e880: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
e890: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
e8a0: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
e8b0: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
e8c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
e8d0: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
e8e0: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
e8f0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
e900: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
e910: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
e920: 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c  ffinity_ok = sql
e930: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
e940: 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61 43  yOk(pX, pTab->aC
e950: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
e960: 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  y);..      for(p
e970: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e980: 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d  ; pIdx && eType=
e990: 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  =0 && affinity_o
e9a0: 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  k; pIdx=pIdx->pN
e9b0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
e9c0: 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ( (pIdx->aiColum
e9d0: 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20  n[0]==iCol).    
e9e0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46       && sqlite3F
e9f0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
ea00: 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a  NC(db), pIdx->az
ea10: 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65  Coll[0], 0)==pRe
ea20: 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21  q.         && (!
ea30: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20  mustBeUnique || 
ea40: 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d  (pIdx->nKeyCol==
ea50: 31 20 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64  1 && IsUniqueInd
ea60: 65 78 28 70 49 64 78 29 29 29 0a 20 20 20 20 20  ex(pIdx))).     
ea70: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
ea80: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
ea90: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
eaa0: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
eab0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
eac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ead0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
eae0: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
eaf0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  um, iDb);.      
eb00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
eb10: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
eb20: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
eb30: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
eb40: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
eb50: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
eb60: 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49      assert( IN_I
eb70: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
eb80: 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  == IN_INDEX_INDE
eb90: 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20  X_ASC+1 );.     
eba0: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
ebb0: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20  INDEX_INDEX_ASC 
ebc0: 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  + pIdx->aSortOrd
ebd0: 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20  er[0];..        
ebe0: 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75    if( prRhsHasNu
ebf0: 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  ll && !pTab->aCo
ec00: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
ec10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
ec20: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
ec30: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ec40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ec50: 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
ec60: 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
ec70: 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
ec80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ec90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
eca0: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
ecb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ecc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ecd0: 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
ece0: 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
ecf0: 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
ed00: 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
ed10: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
ed20: 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
ed30: 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
ed40: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
ed50: 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
ed60: 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
ed70: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
ed80: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 6e 74  S is not contant
ed90: 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
eda0: 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
edb0: 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
edc0: 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
edd0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
ede0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
edf0: 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
ee00: 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
ee10: 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
ee20: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
ee30: 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
ee40: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
ee50: 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
ee60: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
ee70: 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
ee80: 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
ee90: 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
eea0: 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
eeb0: 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
eec0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
eed0: 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20  EX_NOOP;.  }.   
eee0: 20 20 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d    ..  if( eType=
eef0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
ef00: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
ef10: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
ef20: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
ef30: 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
ef40: 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
ef50: 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
ef60: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
ef70: 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
ef80: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
ef90: 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
efa0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
efb0: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
efc0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
efd0: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
efe0: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
eff0: 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
f000: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
f010: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
f020: 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
f030: 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
f040: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
f050: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f060: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
f070: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
f080: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
f090: 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
f0a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
f0b0: 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
f0c0: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
f0d0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
f0e0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f0f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f100: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
f110: 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
f120: 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
f130: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
f140: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
f150: 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
f160: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
f170: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
f180: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
f190: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
f1a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
f1b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f1c0: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
f1d0: 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
f1e0: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
f1f0: 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
f200: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
f210: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
f220: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
f230: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
f240: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
f250: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
f260: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
f270: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
f280: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
f290: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
f2a0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
f2b0: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
f2c0: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
f2d0: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
f2e0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
f2f0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
f300: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
f310: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
f320: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
f330: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
f340: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
f350: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
f360: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
f370: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
f380: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
f390: 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
f3a0: 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
f3b0: 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
f3c0: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
f3d0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
f3e0: 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
f3f0: 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
f400: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
f410: 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
f420: 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
f430: 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
f440: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
f450: 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
f460: 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
f470: 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
f480: 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
f490: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
f4a0: 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
f4b0: 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
f4c0: 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
f4d0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
f4e0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
f4f0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
f500: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
f510: 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
f520: 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
f530: 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
f540: 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
f550: 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73  LLs..** All this
f560: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
f570: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
f580: 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
f590: 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a  y rMayHaveNull.*
f5a0: 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  * to NULL.  Call
f5b0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
f5c0: 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63  l take care of c
f5d0: 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
f5e0: 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74  ister.** value t
f5f0: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
f600: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
f610: 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ee..**.** For a 
f620: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
f630: 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
f640: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
f650: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
f660: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e   result.  For IN
f670: 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
f680: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f690: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
f6a0: 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e  ue is 0..*/.#ifn
f6b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f6c0: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
f6d0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
f6e0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
f6f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
f700: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
f710: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
f720: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
f730: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
f740: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
f750: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73  or */.  int rHas
f760: 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20  NullFlag,       
f770: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
f780: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
f790: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
f7a0: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
f7b0: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
f7c0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
f7d0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
f7e0: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
f7f0: 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61  .  int jmpIfDyna
f800: 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  mic = -1;       
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f820: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
f830: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
f840: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
f870: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
f880: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
f890: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f8a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f8b0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
f8c0: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
f8d0: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
f8e0: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
f8f0: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
f900: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
f910: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
f920: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
f930: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
f940: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
f950: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
f960: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
f970: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
f980: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
f990: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
f9a0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
f9b0: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
f9c0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
f9d0: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
f9e0: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
f9f0: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
fa00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
fa10: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
fa20: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
fa30: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
fa40: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
fa50: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
fa60: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
fa70: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
fa80: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
fa90: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
faa0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
fab0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
fac0: 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
fad0: 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
fae0: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
faf0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
fb00: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
fb10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fb20: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
fb30: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
fb40: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
fb50: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
fb60: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
fb70: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58   pParse->db, "EX
fb80: 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55  ECUTE %s%s SUBQU
fb90: 45 52 59 20 25 64 22 2c 20 6a 6d 70 49 66 44 79  ERY %d", jmpIfDy
fba0: 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52  namic>=0?"":"COR
fbb0: 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20  RELATED ",.     
fbc0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
fbd0: 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c  _IN?"LIST":"SCAL
fbe0: 41 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  AR", pParse->iNe
fbf0: 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29  xtSelectId.    )
fc00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fc10: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
fc20: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
fc30: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
fc40: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
fc50: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
fc60: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
fc70: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fc80: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
fc90: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
fca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
fcb0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
fcc0: 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
fcd0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
fd00: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
fd10: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
fd20: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
fd30: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
fd40: 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
fd50: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
fd60: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
fd70: 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
fd80: 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
fd90: 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ation */..      
fda0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
fdb0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
fdc0: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
fdd0: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
fde0: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
fdf0: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
fe00: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
fe10: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
fe20: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
fe30: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
fe40: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
fe50: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
fe60: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
fe70: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
fe80: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
fe90: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
fea0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
feb0: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
fec0: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
fed0: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
fee0: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
fef0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
ff00: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
ff10: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
ff20: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
ff30: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
ff40: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
ff50: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
ff60: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
ff70: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
ff80: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
ff90: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
ffa0: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
ffb0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
ffc0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
ffd0: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
ffe0: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
fff0: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
10000 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
10010 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
10020 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
10030 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
10040 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
10050 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
10060 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
10070 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
10080 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
10090 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
100a0 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
100b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
100c0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
100d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
100e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
100f0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
10100 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b  Rowid);.      pK
10110 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
10120 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
10130 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
10140 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20  e->db, 1, 1);.. 
10150 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
10160 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
10170 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
10180 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
10190 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
101a0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
101b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
101c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
101d0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
101e0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
101f0 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
10200 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
10210 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
10220 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
10230 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
10240 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
10250 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
10260 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
10270 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
10280 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  st;.        Expr
10290 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
102a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
102b0 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
102c0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
102d0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
102e0 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
102f0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
10300 20 64 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20   dest.affSdst = 
10310 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  (u8)affinity;.  
10320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
10330 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
10340 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
10350 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
10360 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
10370 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
10380 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
10390 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
103a0 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
103b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
103c0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
103d0 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
103e0 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
103f0 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
10400 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
10410 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10420 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
10430 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10440 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
10450 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
10460 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
10480 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10490 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
104a0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
104b0 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
104c0 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
104d0 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
104e0 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
104f0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
10500 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
10510 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
10520 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
10530 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
10540 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
10550 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
10560 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
10570 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
10580 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
10590 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
105a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
105f0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
10600 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
10610 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
10620 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
10630 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
10640 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
10650 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
10660 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
10670 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
10680 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
10690 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
106a0 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
106b0 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
106c0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
106d0 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
106e0 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
106f0 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
10700 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
10710 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
10720 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
10730 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
10740 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
10750 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
10760 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
10770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
10780 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
10790 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
107a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
107b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
107c0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
107d0 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
107e0 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
107f0 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
10800 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
10810 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
10820 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
10830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10840 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
10850 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
10860 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
10870 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
10880 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
10890 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
108a0 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
108b0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
108c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
108d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
108e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
108f0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
10900 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
10910 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
10920 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10930 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10940 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
10950 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10960 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
10970 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
10980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10990 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
109a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
109b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
109c0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
109d0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
109e0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
109f0 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
10a00 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
10a10 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
10a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10a30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10a40 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
10a50 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
10a60 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
10a70 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
10a80 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
10a90 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
10aa0 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
10ab0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
10ac0 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
10ad0 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
10ae0 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
10af0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
10b00 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
10b10 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
10b20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
10b30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10b40 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
10b50 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
10b60 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
10b70 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
10b80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10b90 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
10ba0 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
10bb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
10bc0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
10bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
10be0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
10bf0 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
10c00 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
10c10 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
10c20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
10c30 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
10c40 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
10c50 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
10c60 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
10c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10c80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10c90 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
10ca0 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
10cb0 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
10cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10cd0 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
10ce0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
10cf0 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
10d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
10d10 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
10d20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10d30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10d40 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
10d50 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
10d80 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
10d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
10da0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10dd0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
10de0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
10df0 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
10e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10e20 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
10e30 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
10e40 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
10e50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
10e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
10e70 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10e80 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
10e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10eb0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
10ec0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
10ed0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
10ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
10ef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10f00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10f10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10f20 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
10f30 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
10f40 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
10f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10f60 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
10f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10f80 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
10f90 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
10fa0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
10fb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
10fd0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
10fe0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
10ff0 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
11000 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
11010 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
11020 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
11030 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
11040 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
11050 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
11060 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
11070 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
11080 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
11090 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
110a0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
110b0 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
110c0 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
110d0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
110e0 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
110f0 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
11100 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
11110 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
11120 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
11130 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
11140 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
11150 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
11160 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
11190 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
111a0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
111b0 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111d0 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
111e0 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
111f0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
11200 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
11210 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
11220 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
11230 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
11240 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11250 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
11260 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
11270 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
11280 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
11290 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
112a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
112b0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
112c0 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
112d0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
112e0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
112f0 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
11300 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
11310 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
11320 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
11330 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
11340 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
11350 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74        dest.iSdst
11360 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
11370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11390 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
113a0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
113b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
113c0 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
113d0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
113e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
113f0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
11400 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
11410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11420 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11430 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
11440 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
11450 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
11460 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
11470 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
11480 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11490 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
114a0 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
114b0 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
114c0 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
114d0 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
114e0 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
11510 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
11520 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
11530 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
11540 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
11550 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
11560 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
11570 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11580 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
11590 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
115a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
115b0 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
115c0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
115d0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
115e0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
115f0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
11600 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11610 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
11620 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
11630 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
11640 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11650 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
11660 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
11670 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
11680 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11690 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
116a0 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
116b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
116c0 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
116d0 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
116e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
116f0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
11700 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11710 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
11720 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11730 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
11740 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
11750 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
11760 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
11770 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
11780 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
11790 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
117a0 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
117b0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
117c0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
117d0 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
117e0 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
117f0 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
11800 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11810 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
11820 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
11830 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
11840 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
11850 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11860 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
11870 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
11880 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
11890 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
118a0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
118b0 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
118c0 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
118d0 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
118e0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
118f0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
11900 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
11910 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
11920 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
11930 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
11940 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
11950 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
11960 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
11970 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
11980 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
11990 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
119a0 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
119b0 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
119c0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
119d0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
119e0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
119f0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
11a00 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
11a10 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
11a20 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11a30 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
11a40 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
11a50 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
11a60 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
11a70 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
11a80 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
11a90 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
11aa0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
11ab0 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
11ac0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
11ad0 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
11ae0 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
11af0 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
11b00 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
11b10 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
11b20 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
11b30 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
11b40 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
11b50 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
11b60 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
11b70 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  s */.  char affi
11b80 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  nity;        /* 
11b90 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e  Comparison affin
11ba0 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ity to use */.  
11bb0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
11bc0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
11bd0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
11be0 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
11bf0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
11c00 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
11c10 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
11c20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
11c30 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
11c40 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  truction */..  /
11c50 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48  * Compute the RH
11c60 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20  S.   After this 
11c70 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20  step, the table 
11c80 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a  with cursor.  **
11c90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77   pExpr->iTable w
11ca0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ill contains the
11cb0 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
11cc0 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20  e up the RHS..  
11cd0 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
11ce0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
11cf0 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
11d00 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
11d10 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
11d20 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
11d30 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
11d40 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
11d50 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
11d60 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
11d70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
11da0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
11db0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
11dc0 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
11df0 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
11e00 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20  RhsHasNull);..  
11e10 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
11e20 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
11e30 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
11e40 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
11e50 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65  ts.  ** of the e
11e60 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
11e70 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
11e80 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
11e90 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20  itable for.  ** 
11ea0 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P4 of OP_MakeRec
11eb0 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69  ord..  */.  affi
11ec0 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
11ed0 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
11ee0 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  ;..  /* Code the
11ef0 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
11f00 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
11f10 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20   (...)"..  */.  
11f20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11f30 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
11f40 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
11f50 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11f60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11f70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11f80 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20  >pLeft, r1);..  
11f90 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
11fa0 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
11fb0 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
11fc0 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
11fd0 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
11fe0 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
11ff0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
12000 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
12010 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
12020 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
12030 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
12040 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
12050 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
12060 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
12070 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
12080 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
12090 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
120a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
120b0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
120c0 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
120d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
120e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
120f0 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
12100 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
12110 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
12120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
12130 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12140 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
12150 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
12160 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
12170 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
12180 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
12190 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
121a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
121b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
121c0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
121d0 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
121e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
121f0 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
12200 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
12210 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
12220 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
12230 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
12240 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
12250 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
12260 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
12270 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
12280 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
12290 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
122a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
122b0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
122c0 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
122d0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
122e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
122f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
12300 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
12310 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
12320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12330 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
12340 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
12350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12360 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
12370 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
12380 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
12390 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
123a0 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
123b0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
123c0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
123d0 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
123e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
123f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12400 76 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  v, affinity);.  
12410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12420 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
12430 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
12440 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
12450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12460 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65  v, OP_Ne, r1, de
12470 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
124a0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
124b0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
124c0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
124d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
124e0 28 76 2c 20 61 66 66 69 6e 69 74 79 20 7c 20 53  (v, affinity | S
124f0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
12500 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12510 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12520 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12530 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
12540 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
12550 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
12560 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12570 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
12580 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
12590 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
125a0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
125b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
125c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
125d0 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
125e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
125f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
12600 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
12610 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12620 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
12630 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
12640 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
12650 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68   LHS is NULL, th
12660 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12670 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72   either false or
12680 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a   NULL depending.
12690 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65      ** on whethe
126a0 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
126b0 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
126c0 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ctively..    */.
126d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
126e0 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78  xprCanBeNull(pEx
126f0 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20  pr->pLeft) ){.  
12700 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
12710 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
12720 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ){.        /* Sh
12730 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
12740 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
12750 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e   the false and N
12760 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65  ULL outcomes are
12770 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
12780 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
12790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
127a0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
127b0 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
127c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
127d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
127e0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
127f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12800 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
12810 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
12820 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12840 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12850 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
12860 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
12870 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12880 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
128a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
128b0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
128c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
128d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
128e0 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
128f0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65    }.  .    if( e
12900 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
12910 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
12920 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
12930 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
12940 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
12950 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ree.      */.   
12960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12970 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
12980 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66  eInt, r1, destIf
12990 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65  False); VdbeCove
129a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
129b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
129c0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
129d0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
129e0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
129f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
12a00 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
12a10 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
12a20 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
12a30 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
12a40 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f  b-tree..      */
12a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12a60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
12a70 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20  ffinity, r1, 1, 
12a80 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
12a90 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
12aa0 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
12ab0 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20  hip test fails, 
12ac0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12ad0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
12ae0 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
12af0 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
12b00 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
12b10 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
12b20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
12b30 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
12b40 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12b50 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
12b60 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61   .      ** conta
12b70 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12b80 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
12b90 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
12ba0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  the.      ** exp
12bb0 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
12bc0 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  NULL..      */. 
12bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
12be0 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66  tIfFalse!=destIf
12bf0 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e  Null || rRhsHasN
12c00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
12c10 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d  if( rRhsHasNull=
12c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
12c30 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
12c40 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
12c50 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
12c60 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20   that the RHS.  
12c70 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
12c80 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c  contain NULL val
12c90 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
12ca0 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
12cb0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
12cc0 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
12cd0 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
12ce0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
12cf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
12d00 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69   ** Also run thi
12d10 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c  s branch if NULL
12d20 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
12d30 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20  o FALSE.        
12d40 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74  ** for this part
12d50 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74  icular IN operat
12d60 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
12d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12d80 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
12d90 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
12da0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
12db0 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a  fFalse, r1, 1);.
12dc0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12dd0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
12de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
12df0 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c   In this branch,
12e00 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
12e10 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  IN might contain
12e20 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20   a NULL and.    
12e30 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
12e40 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
12e50 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
12e60 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
12e70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
12e80 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a  tcome..        *
12e90 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31  /.        int j1
12ea0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
12eb0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
12ec0 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ee if the LHS is
12ed0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12ee0 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20  e RHS.  If so,. 
12ef0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
12f00 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52 55  he answer is TRU
12f10 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  E the presence o
12f20 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
12f30 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  HS does.        
12f40 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  ** not matter.  
12f50 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  If the LHS is no
12f60 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
12f70 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65  he RHS, then the
12f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77  .        ** answ
12f90 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  er is NULL if th
12fa0 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  e RHS contains N
12fb0 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73  ULLs and the ans
12fc0 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a  wer is.        *
12fd0 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 52  * FALSE if the R
12fe0 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
12ff0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13000 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
13010 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
13020 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
13030 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c  ->iTable, 0, r1,
13040 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
13050 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13070 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
13080 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
13090 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  l, destIfNull);.
130a0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
130b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
130c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130d0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
130e0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
130f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13100 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
13110 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
13120 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
13130 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13140 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
13150 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
13160 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
13170 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
13180 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23   IN expr"));.}.#
13190 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
131a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
131b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
131c0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
131d0 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  OINT./*.** Gener
131e0 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
131f0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
13200 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f   the floating po
13210 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73  int.** value des
13220 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e  cribed by z[0..n
13230 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
13240 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
13250 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
13260 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
13270 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
13280 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
13290 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
132a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
132b0 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
132c0 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
132d0 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
132e0 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
132f0 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
13300 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
13310 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
13320 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61  har *z, int nega
13330 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  teFlag, int iMem
13340 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ){.  if( ALWAYS(
13350 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75  z!=0) ){.    dou
13360 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73  ble value;.    s
13370 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
13380 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72  alue, sqlite3Str
13390 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45  len30(z), SQLITE
133a0 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65  _UTF8);.    asse
133b0 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61  rt( !sqlite3IsNa
133c0 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54  N(value) ); /* T
133d0 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65  he new AtoF neve
133e0 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f  r returns NaN */
133f0 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46  .    if( negateF
13400 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
13410 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  alue;.    sqlite
13420 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
13430 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69  v, OP_Real, 0, i
13440 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61  Mem, 0, (u8*)&va
13450 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20  lue, P4_REAL);. 
13460 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
13470 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
13480 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
13490 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
134a0 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
134b0 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
134c0 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
134d0 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78  r iMem..**.** Ex
134e0 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61  pr.u.zToken is a
134f0 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a  lways UTF8 and z
13500 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a  ero-terminated..
13510 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
13520 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65  odeInteger(Parse
13530 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13540 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
13550 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
13560 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
13570 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
13580 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
13590 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
135a0 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d    int i = pExpr-
135b0 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61  >u.iValue;.    a
135c0 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
135d0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
135e0 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
135f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13600 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
13610 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
13620 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20  .    int c;.    
13630 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63  i64 value;.    c
13640 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
13650 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
13660 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
13670 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69   );.    c = sqli
13680 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
13690 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
136a0 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d   if( c==0 || (c=
136b0 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29  =2 && negFlag) )
136c0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
136d0 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63  lag ){ value = c
136e0 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  ==2 ? SMALLEST_I
136f0 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d  NT64 : -value; }
13700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13710 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
13720 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
13730 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
13740 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  e, P4_INT64);.  
13750 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
13760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13770 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
13780 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13790 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
137a0 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
137b0 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
137c0 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
137d0 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
137e0 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45  _OMIT_HEX_INTEGE
137f0 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  R.      if( sqli
13800 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22  te3_strnicmp(z,"
13810 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  0x",2)==0 ){.   
13820 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13830 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65  rMsg(pParse, "he
13840 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69  x literal too bi
13850 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  g: %s", z);.    
13860 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
13870 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
13880 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
13890 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
138a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
138b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
138c0 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e  Clear a cache en
138d0 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  try..*/.static v
138e0 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c  oid cacheEntryCl
138f0 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
13900 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  e, struct yColCa
13910 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  che *p){.  if( p
13920 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20  ->tempReg ){.   
13930 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
13940 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
13950 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
13960 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  ) ){.      pPars
13970 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
13980 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
13990 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  = p->iReg;.    }
139a0 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
139b0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
139c0 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
139d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
139e0 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
139f0 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
13a00 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
13a10 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
13a20 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
13a30 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
13a40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
13a50 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
13a60 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
13a70 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
13a80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
13a90 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
13aa0 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
13ab0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
13ac0 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72   /* Unless an er
13ad0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
13ae0 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  , register numbe
13af0 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f  rs are always po
13b00 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73  sitive. */.  ass
13b10 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70  ert( iReg>0 || p
13b20 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
13b30 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13b40 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
13b50 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26  ert( iCol>=-1 &&
13b60 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20   iCol<32768 );  
13b70 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e  /* Finite column
13b80 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f   numbers */..  /
13b90 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c  * The SQLITE_Col
13ba0 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69  umnCache flag di
13bb0 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d  sables the colum
13bc0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69  n cache.  This i
13bd0 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20  s used.  ** for 
13be0 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  testing only - t
13bf0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51  o verify that SQ
13c00 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73  Lite always gets
13c10 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
13c20 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77  .  ** with and w
13c30 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d  ithout the colum
13c40 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  n cache..  */.  
13c50 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
13c60 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
13c70 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75  >db, SQLITE_Colu
13c80 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72  mnCache) ) retur
13c90 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72  n;..  /* First r
13ca0 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
13cb0 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a  ing entry..  **.
13cc0 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
13cd0 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d  he way the colum
13ce0 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65  n cache is curre
13cf0 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72  ntly used, we ar
13d00 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a  e guaranteed.  *
13d10 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63  * that the objec
13d20 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72  t will never alr
13d30 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65  eady be in cache
13d40 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67  .  Verify this g
13d50 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23  uarantee..  */.#
13d60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13d70 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
13d80 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
13d90 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
13da0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
13db0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65    assert( p->iRe
13dc0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c  g==0 || p->iTabl
13dd0 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43  e!=iTab || p->iC
13de0 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20  olumn!=iCol );. 
13df0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13e00 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c  Find an empty sl
13e10 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  ot and replace i
13e20 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
13e30 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
13e40 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
13e50 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
13e60 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
13e70 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iReg==0 ){.     
13e80 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
13e90 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
13ea0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
13eb0 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  e = iTab;.      
13ec0 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  p->iColumn = iCo
13ed0 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  l;.      p->iReg
13ee0 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70   = iReg;.      p
13ef0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
13f00 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
13f10 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
13f20 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
13f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13f40 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
13f50 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
13f60 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
13f70 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
13f80 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
13f90 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13fa0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13fb0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13fc0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
13fd0 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
13fe0 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
13ff0 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
14000 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
14010 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
14020 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
14030 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
14040 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
14050 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
14060 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
14070 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
14080 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
14090 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
140a0 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
140b0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
140c0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
140d0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
140e0 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
140f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
14100 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
14110 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
14120 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
14130 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
14140 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
14150 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
14160 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
14170 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
14180 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
14190 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
141a0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
141b0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
141c0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
141d0 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  t i;.  int iLast
141e0 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d   = iReg + nReg -
141f0 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   1;.  struct yCo
14200 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
14210 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14220 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14230 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
14240 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14250 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
14260 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20      if( r>=iReg 
14270 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20  && r<=iLast ){. 
14280 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
14290 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
142a0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
142b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
142c0 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
142d0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
142e0 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
142f0 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
14300 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
14310 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
14320 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
14330 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
14340 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
14350 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
14360 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
14370 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14380 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
14390 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
143a0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
143b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
143c0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
143d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
143e0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
143f0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
14400 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
14410 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14420 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
14430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
14440 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
14450 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
14460 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
14470 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
14480 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
14490 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
144a0 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
144b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
144c0 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
144d0 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
144e0 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
144f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
14500 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
14510 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
14520 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
14530 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
14540 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
14550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
14560 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
14570 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
14580 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
14590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
145a0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
145b0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
145c0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
145d0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
145e0 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
145f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14600 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
14610 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
14620 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14630 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14640 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14650 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
14660 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70  g && p->iLevel>p
14670 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14680 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
14690 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
146a0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
146b0 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
146c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
146d0 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75  en a cached colu
146e0 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61  mn is reused, ma
146f0 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73  ke sure that its
14700 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
14710 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61  no longer availa
14720 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65  ble as a temp re
14730 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20  gister.  ticket 
14740 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d  #3879:  that sam
14750 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69  e.** register mi
14760 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  ght be in the ca
14770 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  che in multiple 
14780 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75  places, so be su
14790 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65  re to.** get the
147a0 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  m all..*/.static
147b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
147c0 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
147d0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
147e0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
147f0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
14800 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
14810 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
14820 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
14830 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
14840 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
14850 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
14860 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65  g ){.      p->te
14870 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  mpReg = 0;.    }
14880 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
14890 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
148a0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
148b0 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
148c0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
148d0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
148e0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
148f0 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64  umnOfTable(.  Vd
14900 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a  be *v,        /*
14910 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   The VDBE under 
14920 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
14930 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
14940 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
14950 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
14960 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  lue */.  int iTa
14970 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20  bCur,    /* The 
14980 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f  table cursor.  O
14990 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20  r the PK cursor 
149a0 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
149b0 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  D */.  int iCol,
149c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
149d0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f  of the column to
149e0 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e   extract */.  in
149f0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
14a00 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
14a10 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67  ue into this reg
14a20 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  ister */.){.  if
14a30 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c  ( iCol<0 || iCol
14a40 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
14a50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14a60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
14a70 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  id, iTabCur, reg
14a80 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
14a90 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
14aa0 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
14ab0 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
14ac0 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20  lumn;.    int x 
14ad0 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  = iCol;.    if( 
14ae0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
14af0 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c  ){.      x = sql
14b00 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
14b10 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  x(sqlite3Primary
14b20 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20  KeyIndex(pTab), 
14b30 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iCol);.    }.   
14b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b50 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75  p3(v, op, iTabCu
14b60 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20  r, x, regOut);. 
14b70 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
14b80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14b90 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
14ba0 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  pTab, iCol, regO
14bb0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
14bc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14bd0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
14be0 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
14bf0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
14c00 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
14c10 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
14c20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73  value in a regis
14c30 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a  ter.  An effort.
14c40 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  ** is made to st
14c50 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
14c60 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
14c70 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20   iReg, but this 
14c80 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e  is.** not guaran
14c90 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74  teed.  The locat
14ca0 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ion of the colum
14cb0 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  n value is retur
14cc0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ned..**.** There
14cd0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
14ce0 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
14cf0 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
14d00 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
14d10 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
14d20 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
14d30 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
14d40 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
14d50 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
14d60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
14d70 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
14d80 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
14d90 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
14da0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
14db0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
14dc0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
14dd0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
14de0 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
14df0 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
14e00 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
14e10 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
14e20 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
14e30 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14e40 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
14e50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
14e60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14e70 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
14e80 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
14e90 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
14ea0 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
14eb0 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
14ec0 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
14ed0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14ee0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
14ef0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14f00 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
14f10 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
14f20 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
14f30 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
14f40 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
14f50 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62  Reg>0 && p->iTab
14f60 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
14f70 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
14f80 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72  n ){.      p->lr
14f90 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
14fa0 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  heCnt++;.      s
14fb0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14fc0 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73  inRegister(pPars
14fd0 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20  e, p->iReg);.   
14fe0 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
14ff0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
15000 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
15010 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
15020 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
15030 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62  le(v, pTab, iTab
15040 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
15050 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a  g);.  if( p5 ){.
15060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15070 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
15080 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20    }else{   .    
15090 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
150a0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54  Store(pParse, iT
150b0 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
150c0 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Reg);.  }.  retu
150d0 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iReg;.}../*.*
150e0 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
150f0 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
15100 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15110 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
15120 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15130 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15140 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
15150 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
15160 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
15170 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
15180 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
15190 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
151a0 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a  "CLEAR\n");.  }.
151b0 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
151c0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
151d0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
151e0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
151f0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
15200 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ->iReg ){.      
15210 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
15220 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
15230 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
15240 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15250 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
15260 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
15270 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
15280 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
15290 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
152a0 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
152b0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
152c0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
152d0 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
152e0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
152f0 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
15300 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
15310 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
15320 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
15330 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
15340 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
15350 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
15360 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
15370 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
15380 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
15390 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
153a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
153b0 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
153c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
153d0 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
153e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
153f0 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
15400 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
15410 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
15420 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
15430 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
15440 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
15450 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
15460 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
15470 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
15480 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
15490 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
154a0 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
154b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
154c0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
154d0 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
154e0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
154f0 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
15500 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
15510 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
15520 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
15530 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
15540 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
15550 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15560 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
15570 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
15580 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
15590 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
155a0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
155b0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
155c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
155d0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
155e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
155f0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
15600 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
15610 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
15620 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
15630 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
15640 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
15650 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
15660 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
15670 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
15680 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
15690 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
156a0 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
156b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
156c0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
156d0 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
156e0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
156f0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  T */../*.** Conv
15700 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ert an expressio
15710 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
15720 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69  EGISTER.*/.stati
15730 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
15740 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
15750 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
15760 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
15770 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
15780 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
15790 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
157a0 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
157b0 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
157c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
157d0 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
157e0 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
157f0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
15800 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
15810 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
15820 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
15830 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
15840 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
15850 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
15860 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
15870 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
15880 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
15890 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
158a0 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
158b0 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
158c0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
158d0 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
158e0 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
158f0 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
15900 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
15910 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
15920 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
15930 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
15940 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
15950 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
15960 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
15970 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
15980 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
15990 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
159a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
159b0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
159c0 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
159d0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
159e0 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
159f0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
15a00 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a20 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
15a30 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
15a40 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
15a50 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
15a60 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
15a70 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
15a80 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
15a90 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
15aa0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
15ab0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
15ac0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
15ad0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
15ae0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
15af0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
15b00 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
15b10 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
15b20 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
15b30 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
15b40 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
15b50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15b60 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
15b70 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
15b80 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
15b90 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20   tempX;         
15ba0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15bb0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ry expression no
15bc0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
15bd0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
15be0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
15bf0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
15c00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15c10 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
15c20 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
15c30 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
15c40 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
15c50 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
15c60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
15c70 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
15c80 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
15c90 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
15ca0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
15cb0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
15cc0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
15cd0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
15ce0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
15cf0 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
15d00 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
15d10 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
15d20 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
15d30 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
15d40 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
15d50 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
15d60 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
15d70 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
15d80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
15d90 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
15da0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
15db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15dc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15dd0 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
15de0 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
15df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
15e20 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
15e30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e40 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
15e50 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
15e60 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
15e70 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
15e80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15e90 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
15ea0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
15eb0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
15ec0 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
15ed0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
15ee0 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
15ef0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
15f00 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
15f10 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
15f20 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
15f30 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
15f40 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
15f50 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
15f60 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
15f70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15f80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15f90 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
15fa0 69 6e 67 20 66 72 6f 6d 20 61 20 70 61 72 74 69  ing from a parti
15fb0 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
15fc0 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50 61        iTab = pPa
15fd0 72 73 65 2d 3e 69 50 61 72 74 49 64 78 54 61 62  rse->iPartIdxTab
15fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15ff0 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
16000 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16010 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
16020 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16050 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69  Expr->iColumn, i
16060 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  Tab, target,.   
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
16090 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62  r->op2);.      b
160a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
160b0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
160c0 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
160d0 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45 78  eger(pParse, pEx
160e0 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  pr, 0, target);.
160f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16100 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
16110 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
16120 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54  POINT.    case T
16130 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
16140 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16150 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16160 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16170 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
16180 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  v, pExpr->u.zTok
16190 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  en, 0, target);.
161a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
161b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
161c0 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
161d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
161e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
161f0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
16200 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
16210 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16220 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
16230 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72  target, 0, pExpr
16240 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
16250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16260 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
16270 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
16280 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16290 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
162a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
162b0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
162c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
162d0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
162e0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
162f0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
16300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
16310 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
16320 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
16330 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
16340 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
16350 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
16360 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16370 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
16380 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
16390 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
163a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
163b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
163c0 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
163d0 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
163e0 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
163f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16400 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
16410 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
16420 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
16430 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
16440 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
16450 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
16460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16470 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
16480 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
16490 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
164a0 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
164b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
164c0 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
164d0 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
164e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
164f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16500 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
16510 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16520 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
16530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16540 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
16550 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
16560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16570 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
16580 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
16590 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
165a0 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
165b0 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
165c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
165d0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
165e0 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
165f0 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
16600 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
16610 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
16620 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
16630 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
16640 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
16650 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
16660 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
16670 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
16680 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
16690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
166a0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
166b0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
166c0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
166d0 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
166e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
166f0 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69  TK_AS: {.      i
16700 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
16710 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16720 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16730 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
16740 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16760 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
16770 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
16780 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
16790 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
167a0 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
167b0 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
167c0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
167d0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
167e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
167f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16800 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
16810 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
16820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16830 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
16840 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
16850 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
16860 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
16870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16880 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
16890 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
168c0 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
168d0 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
168e0 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
168f0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
16900 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
16910 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
16920 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
16930 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
16940 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
16950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16960 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16970 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
16980 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
16990 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
169a0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
169b0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
169c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
169d0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
169e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
169f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16a00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16a10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16a20 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
16a30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16a40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16a50 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
16a60 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
16a70 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
16a80 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
16a90 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
16ac0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
16ad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
16ae0 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
16af0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
16b00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
16b10 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
16b20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
16b30 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
16b40 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
16b50 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16b60 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
16b70 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
16b80 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
16b90 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
16ba0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
16bb0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
16bc0 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
16bd0 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
16be0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
16bf0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
16c00 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
16c10 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
16c20 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
16c30 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
16c40 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16c50 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Eq);.      ass
16c60 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
16c70 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16c80 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
16c90 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16ca0 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Ne);.      testc
16cb0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
16cc0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16cd0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
16ce0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16cf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16d00 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
16d10 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
16d20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16d30 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
16d40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
16d50 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
16d60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16d70 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16d80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16d90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
16da0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
16db0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16dc0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
16dd0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
16de0 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
16df0 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
16e00 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
16e10 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
16e20 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
16e30 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
16e60 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20  QLITE_STOREP2 | 
16e70 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
16e80 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16e90 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45  geIf(v, op==TK_E
16ea0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
16eb0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
16ec0 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65  TK_NE);.      te
16ed0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16ee0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
16ef0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
16f00 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
16f10 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16f20 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
16f30 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
16f40 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
16f50 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
16f60 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
16f70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
16f80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
16f90 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
16fa0 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
16fb0 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
16fc0 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
16fd0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
16fe0 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
16ff0 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
17000 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
17010 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
17020 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17030 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
17040 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
17050 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
17060 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
17070 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
17080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17090 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
170a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
170b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
170c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
170d0 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
170e0 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
170f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17100 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
17110 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
17120 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
17130 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17140 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
17150 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
17160 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
17170 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
17180 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
17190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
171a0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
171b0 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
171c0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
171d0 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
171e0 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
171f0 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
17200 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17210 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
17220 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
17230 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
17240 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
17250 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
17260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17270 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
17280 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
17290 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
172a0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
172b0 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
172c0 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
172d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
172e0 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
172f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17300 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17310 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17320 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
17330 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
17340 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17350 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
17360 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
17370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17380 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
17390 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
173a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
173b0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
173c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
173d0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
173e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
173f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
17400 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
17410 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
17420 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
17430 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
17440 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
17450 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
17460 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
17470 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
17480 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
17490 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
174a0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
174b0 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
174c0 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
174d0 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
174e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
174f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17500 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
17510 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
17520 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
17530 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
17540 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  get);.#endif.   
17550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17560 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
17570 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
17580 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
17590 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
175a0 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
175b0 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
175c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
175d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
175e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
175f0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
17600 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
17610 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17620 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17630 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
17640 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
17650 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17660 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
17670 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
17680 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17690 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
176a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
176b0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
176c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
176d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
176e0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
176f0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
17700 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
17710 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
17720 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17730 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
17740 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
17750 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
17760 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17770 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
17780 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
17790 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
177a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
177b0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
177c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
177d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
177e0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
177f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17800 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
17810 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
17820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17830 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
17840 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
17850 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
17860 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
17870 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
17880 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
17890 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
178a0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
178b0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
178c0 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
178d0 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
178e0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
178f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17910 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
17920 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
17930 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17940 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
17950 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
17960 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
17970 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17980 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
17990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
179a0 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
179b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
179c0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
179d0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
179e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
179f0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
17a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17a10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17a20 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
17a30 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17a40 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17a50 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
17a60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17a70 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
17a80 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
17a90 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
17aa0 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
17ab0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
17ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
17ad0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
17ae0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17af0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
17b00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17b10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
17b20 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
17b30 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
17b40 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
17b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17b60 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
17b70 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
17b80 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
17b90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17ba0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
17bb0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
17bc0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
17bd0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
17be0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
17bf0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
17c00 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
17c10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17c20 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
17c30 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
17c40 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
17c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
17c60 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
17c70 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
17c80 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
17c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
17ca0 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  th of the functi
17cb0 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  on name in bytes
17cc0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
17cd0 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
17ce0 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
17cf0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75   name */.      u
17d00 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  32 constMask = 0
17d10 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ;     /* Mask of
17d20 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
17d30 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nts that are con
17d40 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  stant */.      i
17d50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17d60 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17d70 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  unter */.      u
17d80 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
17d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
17da0 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
17db0 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
17dc0 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
17dd0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
17de0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
17df0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
17e00 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
17e10 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17e20 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17e30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
17e40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17e50 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
17e60 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
17e70 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
17e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
17e90 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
17ea0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
17eb0 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
17ec0 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
17ed0 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
17ee0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
17ef0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
17f00 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
17f10 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
17f20 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
17f30 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Id = sqlite3Strl
17f40 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20  en30(zId);.     
17f50 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
17f60 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
17f70 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c  zId, nId, nFarg,
17f80 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
17f90 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70  if( pDef==0 || p
17fa0 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 20 29 7b  Def->xFunc==0 ){
17fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17fc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17fd0 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69   "unknown functi
17fe0 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  on: %.*s()", nId
17ff0 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
18000 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
18010 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
18020 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
18030 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18040 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
18050 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
18060 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
18070 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
18080 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
18090 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
180a0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
180b0 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
180c0 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
180d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
180e0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
180f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
18100 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
18110 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
18120 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
18130 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18140 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18150 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
18160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18170 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
18180 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
18190 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
181a0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
181b0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
181c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
181d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
181e0 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
181f0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
18200 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18210 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
18220 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
18230 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
18240 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
18250 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18260 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18270 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18280 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18290 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
182a0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
182b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
182c0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
182d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
182e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
182f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18300 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
18310 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18320 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18330 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
18340 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
18350 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
18360 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
18370 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
18380 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
18390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
183a0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
183b0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
183c0 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
183d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
183e0 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
183f0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
18400 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18410 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18420 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
18430 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18440 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
18460 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
18470 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
18480 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
18490 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
184a0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
184b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
184c0 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
184d0 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
184e0 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
184f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18500 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
18510 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
18520 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
18530 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
18540 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
18550 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
18560 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18570 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
18580 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18590 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
185a0 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
185b0 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
185c0 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
185d0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
185e0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
185f0 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
18600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18610 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
18620 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
18630 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
18640 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
18650 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
18660 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
18670 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
18680 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
18690 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
186a0 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
186b0 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
186c0 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
186d0 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
186e0 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
186f0 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
18700 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
18710 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
18720 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
18730 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
18740 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
18750 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
18760 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
18770 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
18780 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
18790 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
187a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
187b0 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
187c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
187d0 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
187e0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
187f0 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
18800 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
18810 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
18820 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
18830 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
18840 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
18850 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
18860 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
18870 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
18880 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
18890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
188a0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
188b0 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
188c0 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
188d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
188e0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
188f0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
18900 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
18910 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
18920 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
18930 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
18940 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
18950 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
18960 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
18970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18980 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18990 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
189a0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
189b0 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
189c0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
189d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
189e0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
189f0 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
18a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
18a30 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
18a40 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TOR);.        sq
18a50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
18a60 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  p(pParse);      
18a70 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
18a80 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
18a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
18aa0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
18ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18ac0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
18ad0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
18ae0 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
18af0 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
18b00 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
18b10 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
18b20 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
18b30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18b40 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
18b50 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
18b60 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
18b70 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
18b80 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
18b90 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
18ba0 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
18bb0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
18bc0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
18bd0 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
18be0 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
18bf0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
18c00 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
18c10 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
18c20 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
18c30 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
18c40 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
18c50 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
18c60 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
18c70 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
18c80 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
18c90 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
18ca0 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
18cb0 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
18cc0 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
18cd0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
18ce0 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
18cf0 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
18d00 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
18d10 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
18d20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
18d30 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
18d40 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
18d50 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
18d60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18d70 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
18d80 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
18d90 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
18da0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
18db0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
18dc0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
18dd0 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
18de0 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
18df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
18e00 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
18e10 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
18e20 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
18e30 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
18e40 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
18e50 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
18e60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
18e70 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
18e80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
18e90 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
18ea0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
18eb0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
18ec0 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
18ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18ee0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
18ef0 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
18f00 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
18f10 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
18f20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
18f30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18f40 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74  Function0, const
18f50 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
18f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18f70 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
18f80 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
18f90 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
18fa0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
18fb0 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
18fc0 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
18fd0 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
18fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
18ff0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
19000 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
19010 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
19020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19040 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19050 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
19060 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
19070 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  CT: {.      test
19080 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
19090 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
190a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
190b0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e  LECT );.      in
190c0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
190d0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
190e0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
190f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19100 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19110 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
19120 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
19130 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19140 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
19150 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
19160 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19170 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
19180 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19190 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
191a0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
191b0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
191c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
191d0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
191e0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
191f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19200 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
19210 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19220 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19230 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
19240 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
19250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19260 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
19270 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
19280 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19290 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
192a0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
192b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
192c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
192d0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
192e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
192f0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
19300 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
19310 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
19320 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
19330 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
19340 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
19350 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
19360 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
19370 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
19380 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
19390 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
193a0 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
193b0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
193c0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
193d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
193e0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
193f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
19400 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
19410 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
19420 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
19430 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Item = pExpr->x.
19440 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
19450 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
19460 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  LItem->pExpr;.. 
19470 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19480 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19490 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
194a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
194b0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
194c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
194d0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
194e0 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
194f0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
19500 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19510 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
19520 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
19530 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19540 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
19550 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19560 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19570 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
19580 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
19590 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
195c0 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20 56 64  TE_STOREP2);  Vd
195d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
195e0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
195f0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
19600 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
19610 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19620 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19630 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
19640 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
19650 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19660 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
19670 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
19680 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
19690 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
196a0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
196b0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
196c0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
196d0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
196e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
196f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
19700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19710 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
19720 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
19730 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19740 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19750 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
19760 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19770 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
19780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19790 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
197a0 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
197b0 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
197c0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
197d0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
197e0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
197f0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
19800 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19810 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
19820 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
19830 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
19840 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
19850 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
19860 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
19870 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
19880 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
19890 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
198a0 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
198b0 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
198c0 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
198d0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
198e0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
198f0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
19900 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
19910 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
19920 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
19930 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
19940 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
19950 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
19960 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
19970 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
19980 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
19990 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
199a0 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
199b0 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
199c0 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
199d0 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
199e0 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
199f0 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
19a00 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
19a10 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
19a20 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
19a30 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
19a40 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
19a50 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
19a60 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
19a70 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
19a80 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
19a90 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
19aa0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
19ab0 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
19ac0 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
19ad0 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
19ae0 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
19af0 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
19b00 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
19b10 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
19b20 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
19b30 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
19b40 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
19b50 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
19b60 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
19b70 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
19b80 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
19b90 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
19ba0 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
19bb0 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
19bc0 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
19bd0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
19be0 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
19bf0 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
19c00 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
19c10 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
19c20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
19c30 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
19c40 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
19c50 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
19c60 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
19c70 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
19c80 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
19c90 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
19ca0 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
19cb0 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
19cc0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
19cd0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
19ce0 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
19cf0 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
19d00 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
19d10 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
19d20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
19d30 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
19d40 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
19d50 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
19d60 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
19d70 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
19d80 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
19d90 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
19da0 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
19db0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
19dc0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
19dd0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
19de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19df0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
19e00 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
19e10 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
19e20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19e30 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
19e40 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
19e50 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
19e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
19e70 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
19e80 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
19e90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19ea0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
19eb0 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
19ec0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
19ed0 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
19ee0 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
19ef0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
19f00 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
19f10 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
19f20 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
19f30 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
19f40 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
19f50 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
19f60 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
19f70 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
19f80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
19f90 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
19fa0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
19fb0 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
19fc0 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
19fd0 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
19fe0 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
19ff0 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
1a000 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
1a010 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
1a020 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
1a030 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a040 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
1a050 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
1a060 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
1a070 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
1a080 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
1a090 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
1a0a0 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
1a0b0 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
1a0c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1a0d0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
1a0e0 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
1a0f0 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
1a100 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
1a110 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
1a120 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1a130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a140 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
1a150 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
1a160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a180 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
1a190 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
1a1a0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
1a1b0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
1a1c0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
1a1d0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
1a1e0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
1a1f0 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
1a200 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
1a210 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
1a220 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
1a230 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
1a240 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
1a250 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
1a260 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
1a270 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
1a280 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
1a290 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
1a2a0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
1a2b0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
1a2c0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
1a2d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
1a2e0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
1a2f0 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1a300 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
1a310 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
1a320 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
1a330 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
1a340 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
1a350 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
1a360 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
1a370 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
1a380 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
1a390 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
1a3a0 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
1a3b0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
1a3c0 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
1a3d0 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
1a3e0 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
1a3f0 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
1a400 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
1a410 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
1a420 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
1a430 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
1a440 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
1a450 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
1a460 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1a470 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a480 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
1a490 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
1a4a0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
1a4b0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
1a4c0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
1a4d0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
1a4e0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
1a4f0 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
1a500 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
1a510 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
1a520 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
1a530 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
1a540 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
1a550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
1a560 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
1a570 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
1a580 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
1a590 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1a5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
1a5b0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
1a5c0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
1a5d0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
1a600 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
1a610 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
1a620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a640 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1a650 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1a660 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
1a670 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1a680 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
1a690 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1a6a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
1a6b0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
1a6c0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
1a6d0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
1a6e0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
1a6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a700 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
1a710 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
1a720 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a740 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
1a750 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
1a760 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a780 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
1a790 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
1a7a0 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f  B) */.      VVA_
1a7b0 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65  ONLY( int iCache
1a7c0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
1a7d0 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a  iCacheLevel; )..
1a7e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1a7f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1a800 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1a810 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
1a820 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
1a830 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
1a840 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
1a850 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
1a860 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1a870 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
1a880 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1a890 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
1a8a0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
1a8b0 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
1a8c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1a8d0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
1a8e0 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
1a8f0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
1a900 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20   tempX = *pX;.  
1a910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a920 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
1a930 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
1a940 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d  rToRegister(&tem
1a950 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  pX, sqlite3ExprC
1a960 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1a970 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
1a980 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a990 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1a9a0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
1a9b0 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
1a9c0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
1a9d0 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58  e.pLeft = &tempX
1a9e0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
1a9f0 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
1aa00 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
1aa10 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
1aa20 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
1aa30 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
1aa40 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
1aa50 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
1aa60 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
1aa70 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
1aa80 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
1aa90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1aaa0 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
1aab0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
1aac0 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
1aad0 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
1aae0 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
1aaf0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
1ab00 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
1ab10 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
1ab20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ab30 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b  nExpr-1; i=i+2){
1ab40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ab50 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1ab60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
1ab70 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
1ab80 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74     assert( pTest
1ab90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1aba0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
1abb0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
1abc0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1abd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1abe0 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
1abf0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
1ac00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
1ac10 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
1ac20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1ac30 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1ac40 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
1ac50 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1ac60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ac70 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1ac80 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c  pTest, nextCase,
1ac90 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1aca0 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  LL);.        tes
1acb0 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
1acc0 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
1acd0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
1ace0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1acf0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
1ad00 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
1ad10 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1ad20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1ad40 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  o, 0, endLabel);
1ad50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ad60 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1ad70 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
1ad80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ad90 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73  Label(v, nextCas
1ada0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1adb0 20 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21    if( (nExpr&1)!
1adc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1add0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1ade0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1adf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ae00 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
1ae10 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70  st->a[nExpr-1].p
1ae20 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1ae30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ae40 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1ae50 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
1ae60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ae80 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1ae90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1aea0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1aeb0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
1aec0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20  rse->nErr>0 .   
1aed0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
1aee0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
1aef0 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20  iCacheLevel );. 
1af00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1af10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1af20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
1af30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1af40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1af50 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
1af60 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
1af70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1af80 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1af90 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20  _Rollback .     
1afa0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
1afb0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
1afc0 72 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  rt.           ||
1afd0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1afe0 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
1aff0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
1b000 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
1b010 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  re.      );.    
1b020 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70    if( !pParse->p
1b030 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20  TriggerTab ){.  
1b040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b050 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
1b080 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
1b090 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
1b0a0 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
1b0b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1b0c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b0d0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1b0e0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
1b0f0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
1b100 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
1b110 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1b120 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1b130 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1b140 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1b150 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
1b160 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  nity==OE_Ignore 
1b170 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b180 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
1b190 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
1b1a0 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
1b1b0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70   OE_Ignore, 0, p
1b1c0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
1b1d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
1b1e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b200 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
1b210 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
1b220 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1b230 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20  _TRIGGER,.      
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
1b260 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e  ffinity, pExpr->
1b270 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
1b280 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b290 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1b2a0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
1b2b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b2c0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1b2d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1b2e0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b2f0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
1b300 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
1b310 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75  ./*.** Factor ou
1b320 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68  t the code of th
1b330 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1b340 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61  on to initializa
1b350 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
1b360 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1b370 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73  deAtInit(.  Pars
1b380 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1b390 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1b3a0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1b3b0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  r,      /* The e
1b3c0 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64  xpression to cod
1b3d0 65 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20  e when the VDBE 
1b3e0 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20  initializes */. 
1b3f0 20 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20   int regDest,   
1b400 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1b410 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
1b420 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72  gister */.  u8 r
1b430 65 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a  eusable       /*
1b440 20 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78   True if this ex
1b450 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73  pression is reus
1b460 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  able */.){.  Exp
1b470 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65  rList *p;.  asse
1b480 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  rt( ConstFactorO
1b490 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70  k(pParse) );.  p
1b4a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
1b4b0 74 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d  tExpr;.  pExpr =
1b4c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1b4d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
1b4e0 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c  r, 0);.  p = sql
1b4f0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1b500 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  nd(pParse, p, pE
1b510 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  xpr);.  if( p ){
1b520 0a 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70  .     struct Exp
1b530 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1b540 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78  m = &p->a[p->nEx
1b550 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65  pr-1];.     pIte
1b560 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
1b570 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20  eg = regDest;.  
1b580 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62     pItem->reusab
1b590 6c 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20  le = reusable;. 
1b5a0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f   }.  pParse->pCo
1b5b0 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a  nstExpr = p;.}..
1b5c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b5d0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
1b5e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
1b5f0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
1b600 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
1b610 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
1b620 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
1b630 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
1b640 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
1b650 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
1b660 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
1b670 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1b680 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
1b690 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
1b6a0 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
1b6b0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
1b6c0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
1b6d0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
1b6e0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
1b6f0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
1b700 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
1b710 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
1b720 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
1b730 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65  routine might ge
1b740 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63  nerate this.** c
1b750 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20  ode to fill the 
1b760 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
1b770 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
1b780 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ection of the.**
1b790 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69   VDBE program, i
1b7a0 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f  n order to facto
1b7b0 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  r it out of the 
1b7c0 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e  evaluation loop.
1b7d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1b7e0 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
1b7f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b800 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
1b810 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20  g){.  int r2;.  
1b820 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1b830 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1b840 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e  Expr);.  if( Con
1b850 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1b860 65 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  e).   && pExpr->
1b870 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a  op!=TK_REGISTER.
1b880 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
1b890 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
1b8a0 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20  in(pExpr).  ){. 
1b8b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d     ExprList *p =
1b8c0 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1b8d0 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xpr;.    int i;.
1b8e0 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a      *pReg  = 0;.
1b8f0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
1b900 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1b910 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b920 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d        for(pItem=
1b930 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72  p->a, i=p->nExpr
1b940 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20  ; i>0; pItem++, 
1b950 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i--){.        if
1b960 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c  ( pItem->reusabl
1b970 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  e && sqlite3Expr
1b980 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
1b990 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d  Expr,pExpr,-1)==
1b9a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1b9b0 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69  eturn pItem->u.i
1b9c0 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20  ConstExprReg;.  
1b9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b9e0 20 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b      }.    r2 = +
1b9f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1ba00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ba10 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1ba20 20 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a   pExpr, r2, 1);.
1ba30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1ba40 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
1ba50 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1ba60 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65  .    r2 = sqlite
1ba70 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1ba80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
1ba90 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d  1);.    if( r2==
1baa0 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  r1 ){.      *pRe
1bab0 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73  g = r1;.    }els
1bac0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1bad0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1bae0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
1baf0 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20    *pReg = 0;.   
1bb00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1bb10 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r2;.}../*.** Gen
1bb20 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1bb30 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
1bb40 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
1bb50 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1bb60 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1bb70 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
1bb80 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
1bb90 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
1bba0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
1bbb0 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64   target..*/.void
1bbc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bbd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bbe0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1bbf0 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20   target){.  int 
1bc00 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74  inReg;..  assert
1bc10 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
1bc20 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
1bc30 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  em );.  if( pExp
1bc40 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  r && pExpr->op==
1bc50 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
1bc60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bc70 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
1bc80 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78  be, OP_Copy, pEx
1bc90 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67  pr->iTable, targ
1bca0 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
1bcb0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1bcc0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1bcd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1bce0 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65  arget);.    asse
1bcf0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
1bd00 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  e || pParse->db-
1bd10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1bd20 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
1bd30 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
1bd40 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
1bd50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bd60 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1bd70 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1bd80 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1bd90 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
1bda0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1bdb0 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
1bdc0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1bdd0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
1bde0 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
1bdf0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
1be00 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
1be10 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
1be20 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
1be30 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74  er target.  If t
1be40 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1be50 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
1be60 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1be70 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20  might choose to 
1be80 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73  code the express
1be90 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a  ion at initializ
1bea0 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76  ation time..*/.v
1beb0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1bec0 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61  odeFactorable(Pa
1bed0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1bee0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1bef0 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61  rget){.  if( pPa
1bf00 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
1bf10 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  or && sqlite3Exp
1bf20 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
1bf30 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
1bf40 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1bf50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1bf60 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  arget, 0);.  }el
1bf70 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1bf80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1bf90 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1bfa0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1bfb0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1bfc0 65 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69  evaluates the gi
1bfd0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
1bfe0 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75  nd puts the resu
1bff0 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  lt.** in registe
1c000 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  r target..**.** 
1c010 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79  Also make a copy
1c020 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1c030 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  on results into 
1c040 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20  another "cache" 
1c050 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20  register.** and 
1c060 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65  modify the expre
1c070 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ssion so that th
1c080 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69  e next time it i
1c090 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20  s evaluated,.** 
1c0a0 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  the result is a 
1c0b0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68  copy of the cach
1c0c0 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
1c0d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c0e0 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65  s used for expre
1c0f0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
1c100 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a  used multiple .*
1c110 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61  * times.  They a
1c120 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63  re evaluated onc
1c130 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
1c140 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
1c150 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65  ion.** are reuse
1c160 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1c170 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
1c180 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
1c190 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c1a0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
1c1b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c1c0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
1c1d0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  m;..  assert( ta
1c1e0 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  rget>0 );.  asse
1c1f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1c200 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
1c210 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1c220 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1c230 61 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d  arget);.  iMem =
1c240 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c250 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1c260 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1c270 20 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a   target, iMem);.
1c280 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1c290 28 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d  (pExpr, iMem);.}
1c2a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c2b0 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
1c2c0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
1c2d0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
1c2e0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1c2f0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74  ression list int
1c300 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  o a sequence of 
1c310 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
1c320 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a  ing at target..*
1c330 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c340 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1c350 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a  ts evaluated..**
1c360 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45  .** The SQLITE_E
1c370 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65  CEL_DUP flag pre
1c380 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65  vents the argume
1c390 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  nts from being.*
1c3a0 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f  * filled using O
1c3b0 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70  P_SCopy.  OP_Cop
1c3c0 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69  y must be used i
1c3d0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstead..**.** Th
1c3e0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  e SQLITE_ECEL_FA
1c3f0 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c  CTOR argument al
1c400 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72  lows constant ar
1c410 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a  guments to be.**
1c420 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e   factored out in
1c430 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
1c440 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n code..*/.int s
1c450 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
1c460 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
1c470 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
1c480 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1c490 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c4a0 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
1c4b0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
1c4c0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1c4d0 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
1c4e0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
1c4f0 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
1c500 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20    u8 flags      
1c510 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45       /* SQLITE_E
1c520 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  CEL_* flags */.)
1c530 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
1c540 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1c550 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 75  .  int i, n;.  u
1c560 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
1c570 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1c580 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
1c590 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 61 73 73   OP_SCopy;.  ass
1c5a0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
1c5b0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1c5c0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1c5d0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
1c5e0 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67  0 );  /* Never g
1c5f0 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68  ets this far oth
1c600 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20  erwise */.  n = 
1c610 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1c620 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72  if( !ConstFactor
1c630 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61  Ok(pParse) ) fla
1c640 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43  gs &= ~SQLITE_EC
1c650 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72  EL_FACTOR;.  for
1c660 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1c670 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
1c680 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
1c690 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65  pr *pExpr = pIte
1c6a0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
1c6b0 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
1c6c0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
1c6d0 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
1c6e0 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1c6f0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1c700 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1c710 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c720 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20  target+i, 0);.  
1c730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1c740 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
1c750 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1c760 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c770 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
1c780 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1c790 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
1c7a0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
1c7b0 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
1c7c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1c7d0 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70        if( copyOp
1c7e0 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
1c7f0 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74     && (pOp=sqlit
1c800 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
1c810 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  1))->opcode==OP_
1c820 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26  Copy.         &&
1c830 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33   pOp->p1+pOp->p3
1c840 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20  +1==inReg.      
1c850 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f     && pOp->p2+pO
1c860 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b  p->p3+1==target+
1c870 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  i.        ){.   
1c880 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
1c890 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c8a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1c8b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c8c0 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74  copyOp, inReg, t
1c8d0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
1c8e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c8f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
1c900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1c910 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42  ate code for a B
1c920 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e  ETWEEN operator.
1c930 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57  .**.**    x BETW
1c940 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a  EEN y AND z.**.*
1c950 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65  * The above is e
1c960 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a  quivalent to .**
1c970 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20  .**    x>=y AND 
1c980 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20  x<=z.**.** Code 
1c990 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
1c9a0 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
1c9b0 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
1c9c0 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e  ession.** elimin
1c9d0 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73  ation of x..*/.s
1c9e0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
1c9f0 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61  odeBetween(.  Pa
1ca00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ca10 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1ca20 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1ca30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1ca40 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
1ca50 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70   The BETWEEN exp
1ca60 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1ca70 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
1ca80 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
1ca90 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
1caa0 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
1cab0 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20  True,   /* Take 
1cac0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1cad0 42 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20  BETWEEN is true 
1cae0 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
1caf0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
1cb00 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
1cb10 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
1cb20 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72  /.){.  Expr expr
1cb30 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
1cb40 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
1cb50 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
1cb60 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
1cb70 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
1cb80 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
1cb90 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
1cba0 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
1cbb0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
1cbc0 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
1cbd0 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
1cbe0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
1cbf0 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
1cc00 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
1cc10 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
1cc20 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1cc30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1cc40 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78  sSelect) );.  ex
1cc50 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
1cc60 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f  eft;.  exprAnd.o
1cc70 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78  p = TK_AND;.  ex
1cc80 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
1cc90 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ompLeft;.  exprA
1cca0 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
1ccb0 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65  pRight;.  compLe
1ccc0 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
1ccd0 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
1cce0 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
1ccf0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
1cd00 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
1cd10 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70  0].pExpr;.  comp
1cd20 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
1cd30 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c  ;.  compRight.pL
1cd40 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1cd50 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
1cd60 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1cd70 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1cd80 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1cd90 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45  &exprX, sqlite3E
1cda0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1cdb0 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
1cdc0 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 6a  Free1));.  if( j
1cdd0 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20  umpIfTrue ){.   
1cde0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1cdf0 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  ue(pParse, &expr
1ce00 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
1ce10 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  fNull);.  }else{
1ce20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ce30 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1ce40 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1ce50 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1ce60 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1ce70 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1ce80 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f   regFree1);..  /
1ce90 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74  * Ensure adequat
1cea0 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20  e test coverage 
1ceb0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  */.  testcase( j
1cec0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1ced0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1cee0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1cef0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1cf00 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d  IfTrue==0 && jum
1cf10 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1cf20 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1cf30 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1cf40 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1cf50 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1cf60 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1cf70 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1cf80 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1cf90 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1cfa0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1cfb0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1cfc0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1cfd0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1cfe0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1cff0 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26  jumpIfTrue!=0 &&
1d000 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1d010 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d020 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d030 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1d040 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1d050 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d060 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d070 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1d080 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1d090 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  ree1!=0 );.}../*
1d0a0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d0b0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
1d0c0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
1d0d0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
1d0e0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
1d0f0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
1d100 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1d110 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
1d120 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
1d130 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
1d140 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d150 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
1d160 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
1d170 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
1d180 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
1d190 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
1d1a0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
1d1b0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
1d1c0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
1d1d0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
1d1e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
1d1f0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
1d200 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
1d210 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
1d220 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
1d230 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
1d240 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
1d250 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
1d260 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
1d270 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
1d280 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
1d290 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
1d2a0 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
1d2b0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
1d2c0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
1d2d0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
1d2e0 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
1d2f0 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
1d300 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
1d310 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
1d320 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
1d330 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
1d340 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1d350 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
1d360 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1d370 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
1d380 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
1d390 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
1d3a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1d3b0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
1d3c0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
1d3d0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
1d3e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
1d3f0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
1d400 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1d410 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
1d420 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1d430 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
1d440 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20  ) )     return; 
1d450 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
1d460 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
1d470 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
1d480 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
1d490 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e   ) return;  /* N
1d4a0 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  o way this can h
1d4b0 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20  appen */.  op = 
1d4c0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
1d4d0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1d4e0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
1d4f0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
1d500 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d510 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
1d520 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1d530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1d540 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1d550 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1d560 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e  Left, d2,jumpIfN
1d570 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
1d580 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  FNULL);.      sq
1d590 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1d5a0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1d5b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1d5c0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1d5d0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1d5e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d5f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1d600 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1d610 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1d620 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1d630 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
1d640 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d650 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
1d660 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1d670 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1d680 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1d690 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1d6a0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1d6b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d6c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d6d0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1d6e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d6f0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1d700 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1d710 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1d720 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1d730 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1d740 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
1d750 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d760 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1d770 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1d780 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1d790 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1d7a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1d7b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1d7c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1d7d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d7e0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
1d7f0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
1d800 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
1d810 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
1d820 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
1d830 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
1d840 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
1d850 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1d860 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
1d870 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d880 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1d890 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1d8a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1d8b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1d8c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1d8d0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1d8e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
1d8f0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1d900 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d910 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1d920 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
1d930 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
1d940 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1d950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1d960 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
1d970 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
1d980 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1d990 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
1d9a0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1d9b0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
1d9c0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
1d9d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d9e0 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
1d9f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
1da00 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
1da10 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
1da20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1da30 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1da40 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
1da50 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
1da60 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
1da70 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1da80 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
1da90 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
1daa0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
1dab0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
1dac0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1dad0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Eq);.      ass
1dae0 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  ert(TK_NE==OP_Ne
1daf0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1db00 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ne); VdbeCove
1db10 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1db20 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Ne);.      testc
1db30 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1db40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1db50 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1db60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1db70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1db80 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1db90 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
1dba0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1dbb0 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
1dbc0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1dbd0 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  SNOT );.      r1
1dbe0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1dbf0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1dc00 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1dc10 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1dc20 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1dc30 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1dc40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1dc50 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1dc60 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1dc70 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1dc80 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  E;.      codeCom
1dc90 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1dca0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1dcb0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
1dce0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1dcf0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1dd00 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
1dd10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1dd20 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1dd30 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
1dd40 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1dd50 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1dd60 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1dd70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1dd80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dd90 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
1dda0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
1ddb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ddc0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
1ddd0 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
1dde0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
1ddf0 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
1de00 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
1de10 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
1de20 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
1de30 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72  TNULL );.      r
1de40 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1de50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1de60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1de70 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1de80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1de90 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73  2(v, op, r1, des
1dea0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
1deb0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1dec0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1ded0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1dee0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1def0 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
1df00 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1df10 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1df20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1df30 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
1df40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1df50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1df60 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1df70 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1df80 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d  pr, dest, 1, jum
1df90 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1dfa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1dfb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dfc0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1dfd0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1dfe0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
1dff0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
1e000 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1e010 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
1e020 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f  l = jumpIfNull ?
1e030 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61   dest : destIfFa
1e040 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse;.      sqlit
1e050 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1e060 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1e070 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
1e080 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1e090 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e0a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1e0b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1e0c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1e0d0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1e0e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e0f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e100 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1e110 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
1e120 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
1e130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e140 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1e150 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
1e160 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
1e170 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
1e180 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1e190 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
1e1a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e1b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e1c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e1d0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1e1e0 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
1e1f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e200 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
1e210 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
1e220 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
1e230 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1e240 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e250 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e260 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e270 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1e290 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1e2a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1e2b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1e2c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1e2d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e2e0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1e2f0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
1e300 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1e310 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1e320 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1e330 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1e340 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1e350 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1e360 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1e370 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
1e380 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1e390 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1e3a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1e3b0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
1e3c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1e3d0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1e3e0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1e3f0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
1e400 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
1e410 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
1e420 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
1e430 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
1e440 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
1e450 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e460 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
1e470 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1e480 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1e490 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1e4a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1e4b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1e4c0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1e4d0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1e4e0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1e4f0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1e500 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1e510 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1e520 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1e530 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e540 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1e550 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
1e560 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1e570 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1e580 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
1e590 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
1e5a0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
1e5b0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
1e5c0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
1e5d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1e5e0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
1e5f0 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1e600 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
1e610 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
1e620 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
1e630 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
1e640 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
1e650 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
1e660 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
1e670 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
1e680 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1e6a0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
1e6b0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
1e6c0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
1e6d0 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
1e6e0 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
1e6f0 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
1e700 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
1e710 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1e730 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
1e740 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
1e750 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
1e760 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
1e770 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
1e780 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
1e790 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
1e7a0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
1e7b0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1e7c0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
1e7d0 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
1e7e0 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
1e7f0 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
1e800 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
1e810 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
1e820 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
1e830 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1e840 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
1e850 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
1e860 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
1e870 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
1e880 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
1e890 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
1e8a0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
1e8b0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1e8c0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
1e8d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1e8e0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
1e8f0 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
1e900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1e910 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
1e920 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
1e930 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1e940 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
1e950 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
1e960 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1e970 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
1e980 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
1e990 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1e9a0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
1e9b0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
1e9c0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1e9d0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
1e9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1e9f0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
1ea00 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
1ea10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1ea20 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
1ea30 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
1ea40 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1ea50 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1ea60 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ea70 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1ea80 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1ea90 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1eaa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1eab0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1eac0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ead0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1eae0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1eaf0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1eb00 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1eb10 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1eb20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1eb30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1eb40 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1eb50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1eb60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1eb70 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1eb80 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1eb90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1eba0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ebb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ebc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1ebd0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1ebe0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1ebf0 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1ec00 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1ec10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ec20 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1ec30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec40 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1ec50 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ec60 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1ec70 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ec80 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ec90 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1eca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ecb0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1ecc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ecd0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1ece0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1ecf0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ed00 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ed10 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1ed20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ed30 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1ed40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1ed50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ed60 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1ed70 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1ed80 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1ed90 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1eda0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1edb0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1edc0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1edd0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1ede0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1edf0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ee00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ee10 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ee20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1ee30 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ee40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1ee50 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1ee60 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1ee70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ee80 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1ee90 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1eeb0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1eec0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
1eed0 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1eee0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1eef0 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1ef00 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1ef10 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
1ef20 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1ef30 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ef40 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1ef50 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1ef60 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
1ef70 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1ef80 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1ef90 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1efa0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1efb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1efc0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1efd0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1efe0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1eff0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1f000 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f010 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1f020 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1f030 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f040 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1f050 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1f060 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1f070 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1f080 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f090 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1f0a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f0b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f0c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f0d0 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1f0e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f0f0 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1f100 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1f110 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f120 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1f130 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1f140 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1f150 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1f160 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1f170 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1f180 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f190 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f1a0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1f1b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f1c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1f1d0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1f1e0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
1f1f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
1f200 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
1f210 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1f220 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f230 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1f240 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1f250 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1f260 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1f270 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1f280 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f290 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20  , op==TK_EQ);.  
1f2a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f2b0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29  If(v, op==TK_NE)
1f2c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f2d0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f2e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f2f0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1f300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f310 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1f320 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1f330 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1f340 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f350 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f360 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f370 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f390 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1f3a0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
1f3b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f3c0 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65  ISNULL );   Vdbe
1f3d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f3e0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
1f3f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1f400 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20  ==TK_NOTNULL ); 
1f410 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f420 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1f430 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
1f440 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f450 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f460 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f470 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1f480 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f490 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f4a0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1f4b0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1f4c0 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70  r, dest, 0, jump
1f4d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1f4e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1f4f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f500 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1f510 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1f520 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
1f530 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f540 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
1f550 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f560 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1f570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1f580 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
1f590 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f5a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1f5b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1f5c0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1f5d0 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
1f5e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1f5f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f600 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
1f610 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1f620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1f630 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1f640 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t: {.      if( e
1f650 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
1f660 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1f670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f680 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1f690 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1f6a0 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
1f6b0 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
1f6c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
1f6d0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
1f6e0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1f6f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f700 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f710 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1f720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f730 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1f740 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
1f750 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1f760 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1f770 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1f780 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f790 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f7a0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1f7b0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1f7c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f7d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1f7e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f7f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1f800 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1f810 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1f820 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1f830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
1f840 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f850 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
1f860 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
1f870 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
1f880 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
1f890 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
1f8a0 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
1f8b0 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
1f8c0 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
1f8d0 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
1f8e0 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
1f8f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
1f900 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
1f910 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
1f920 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1f930 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
1f940 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1f950 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1f960 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
1f970 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
1f980 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
1f990 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
1f9a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1f9b0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1f9c0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f9d0 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
1f9e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f9f0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1fa00 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
1fa10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
1fa20 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
1fa30 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
1fa40 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
1fa50 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
1fa60 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
1fa70 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
1fa80 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
1fa90 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
1faa0 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
1fab0 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
1fac0 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
1fad0 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
1fae0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1faf0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
1fb00 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
1fb10 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
1fb20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
1fb30 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
1fb40 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
1fb50 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
1fb60 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
1fb70 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
1fb80 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
1fb90 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
1fba0 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
1fbb0 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
1fbc0 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
1fbd0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
1fbe0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
1fbf0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
1fc00 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
1fc10 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
1fc20 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
1fc30 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
1fc40 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
1fc50 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
1fc60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1fc70 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
1fc80 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
1fc90 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
1fca0 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
1fcb0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
1fcc0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
1fcd0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
1fce0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
1fcf0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
1fd00 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
1fd10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1fd20 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
1fd30 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
1fd40 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
1fd50 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
1fd60 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
1fd70 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
1fd80 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
1fd90 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
1fda0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
1fdb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
1fdc0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
1fdd0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
1fde0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1fdf0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
1fe00 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
1fe10 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
1fe20 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
1fe30 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
1fe40 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
1fe50 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
1fe60 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
1fe70 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
1fe80 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
1fe90 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
1fea0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1feb0 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
1fec0 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
1fed0 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
1fee0 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
1fef0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
1ff00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
1ff10 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
1ff20 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
1ff30 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
1ff40 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
1ff50 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
1ff60 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
1ff70 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
1ff80 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
1ff90 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
1ffa0 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
1ffb0 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
1ffc0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ffd0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
1ffe0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
1fff0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
20000 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
20010 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
20020 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
20030 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
20040 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
20050 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
20060 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
20070 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
20080 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20090 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
200a0 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
200b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
200c0 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
200d0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
200e0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
200f0 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  YS(pA->op!=TK_AG
20100 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d  G_COLUMN) && pA-
20110 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
20120 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
20130 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
20140 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
20150 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
20160 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
20170 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
20180 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
20190 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
201a0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
201b0 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
201c0 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
201d0 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
201e0 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
201f0 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
20200 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
20210 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
20220 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
20230 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20240 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
20250 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
20260 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
20270 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20280 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
20290 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
202a0 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
202b0 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
202c0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
202d0 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
202e0 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
202f0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
20300 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
20310 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
20320 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
20330 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
20340 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
20350 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
20360 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
20370 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
20380 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
20390 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
203a0 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
203b0 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
203c0 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
203d0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
203e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
203f0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
20400 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
20410 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
20420 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
20430 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
20440 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
20450 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
20460 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
20470 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
20480 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
20490 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
204a0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
204b0 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
204c0 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
204d0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
204e0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
204f0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
20500 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
20510 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
20520 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
20530 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
20540 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
20550 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
20560 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
20570 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
20580 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
20590 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
205a0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
205b0 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
205c0 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
205d0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
205e0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
205f0 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
20600 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
20610 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
20620 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
20630 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
20640 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
20650 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
20660 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
20670 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
20680 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
20690 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
206a0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
206b0 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
206c0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
206d0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
206e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
206f0 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
20700 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
20710 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
20720 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
20730 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
20740 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
20750 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
20760 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
20770 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
20780 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
20790 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
207a0 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
207b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
207c0 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
207d0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
207e0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
207f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20800 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
20810 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
20820 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
20830 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
20840 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
20850 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
20860 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
20870 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
20880 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
20890 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
208a0 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
208b0 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
208c0 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
208d0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
208e0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
208f0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
20900 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
20910 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
20920 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
20930 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
20940 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
20950 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
20960 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
20970 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
20980 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
20990 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
209a0 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
209b0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
209c0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
209d0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
209e0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
209f0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
20a00 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
20a10 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
20a20 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
20a30 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
20a40 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
20a50 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
20a60 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
20a70 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
20a80 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
20a90 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
20aa0 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
20ab0 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
20ac0 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
20ad0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
20ae0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
20af0 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
20b00 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
20b10 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
20b20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
20b30 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
20b40 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
20b50 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
20b60 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
20b70 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
20b80 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
20b90 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
20ba0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
20bb0 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
20bc0 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
20bd0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
20be0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
20bf0 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
20c00 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
20c10 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
20c20 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
20c30 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
20c40 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
20c50 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
20c60 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
20c70 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
20c80 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
20c90 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
20ca0 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
20cb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
20cc0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
20cd0 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
20ce0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
20cf0 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
20d00 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
20d10 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
20d20 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
20d30 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
20d40 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
20d50 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
20d60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
20d70 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
20d80 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
20d90 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
20da0 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
20db0 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
20dc0 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
20dd0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
20de0 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
20df0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
20e00 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
20e10 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
20e20 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
20e30 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
20e40 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
20e50 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
20e60 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
20e70 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
20e80 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
20e90 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
20ea0 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
20eb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
20ec0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
20ed0 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
20ee0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
20ef0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
20f00 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
20f10 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
20f20 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
20f30 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
20f40 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
20f50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
20f60 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
20f70 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
20f80 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
20f90 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
20fa0 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
20fb0 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
20fc0 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
20fd0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
20fe0 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
20ff0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
21000 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
21010 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21020 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
21030 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
21040 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
21050 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
21060 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
21070 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
21080 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
21090 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
210a0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
210b0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
210c0 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
210d0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
210e0 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
210f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
21100 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
21110 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
21120 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
21130 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
21140 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
21150 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
21160 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
21170 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
21180 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
21190 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
211a0 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
211b0 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
211c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
211d0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
211e0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
211f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
21200 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
21210 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
21220 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
21230 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
21240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21250 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
21260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
21270 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
21280 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
21290 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
212a0 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
212b0 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
212c0 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
212d0 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
212e0 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
212f0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
21300 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
21310 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
21320 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
21330 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
21340 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
21350 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
21360 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
21370 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
21380 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
21390 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
213a0 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
213b0 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
213c0 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
213d0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
213e0 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
213f0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
21400 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
21410 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
21420 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
21430 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
21440 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
21450 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
21460 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
21470 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
21480 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
21490 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
214a0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
214b0 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
214c0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
214d0 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
214e0 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
214f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
21500 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
21510 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
21520 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
21530 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
21540 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
21550 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
21560 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
21570 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
21580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
21590 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
215a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
215b0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
215c0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
215d0 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
215e0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
215f0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
21600 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
21610 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
21620 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
21630 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
21640 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
21650 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
21660 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
21670 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
21680 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
21690 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
216a0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
216b0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
216c0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
216d0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
216e0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
216f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
21700 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
21710 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
21720 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
21730 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
21740 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
21750 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
21760 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
21770 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
21780 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
21790 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
217a0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
217b0 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
217c0 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
217d0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
217e0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
217f0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
21800 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
21810 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
21820 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
21830 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
21840 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
21850 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
21860 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
21870 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
21880 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
21890 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
218a0 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
218b0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
218c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
218d0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
218e0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
218f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21900 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
21910 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
21920 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
21930 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
21940 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
21950 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
21960 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
21970 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
21980 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
21990 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
219a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
219b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
219c0 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
219d0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
219e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
219f0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
21a00 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
21a10 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
21a20 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
21a30 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
21a40 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
21a50 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
21a60 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
21a70 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
21a80 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
21a90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21aa0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
21ab0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
21ac0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
21ad0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
21ae0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
21af0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
21b00 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
21b10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21b20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
21b30 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
21b40 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
21b50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
21b60 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
21b70 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
21b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21b90 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
21ba0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
21bb0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
21bc0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
21bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21be0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
21bf0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21c00 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
21c10 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
21c20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
21c30 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
21c40 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
21c50 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
21c60 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
21c70 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
21c80 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
21c90 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
21ca0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21cb0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
21cc0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
21cd0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
21cf0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
21d00 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
21d10 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
21d20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
21d30 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
21d40 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
21d50 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
21d60 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
21d70 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
21d80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
21d90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
21da0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
21db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21dc0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
21dd0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
21de0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
21df0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
21e00 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
21e10 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
21e20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
21e30 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
21e40 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
21e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21e60 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
21e70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
21e80 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
21e90 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
21ea0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
21eb0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
21ec0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
21ed0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
21ee0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
21ef0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
21f00 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
21f10 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
21f20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
21f30 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
21f40 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
21f50 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
21f60 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
21f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f80 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
21f90 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
21fa0 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
21fb0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21fd0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
21fe0 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
21ff0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
22000 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
22010 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
22020 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22030 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
22040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22050 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
22060 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
22080 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
22090 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
220a0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
220b0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
220c0 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
220d0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
220e0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22100 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22110 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
22120 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22170 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
22180 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
22190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
221a0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
221b0 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
221c0 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
221d0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
221e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
221f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
22200 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
22210 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
22220 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
22230 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
22240 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
22250 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
22260 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
22270 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
22280 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
22290 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
222a0 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
222b0 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
222c0 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
222d0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
222e0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
222f0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
22300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22310 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
22320 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22330 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
22340 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
22350 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
22360 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
22370 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
22380 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
22390 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
223a0 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
223b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
223c0 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
223d0 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
223e0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
223f0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
22400 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
22410 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
22420 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
22430 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
22440 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
22450 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
22460 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
22470 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
22480 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
22490 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
224a0 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
224b0 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
224c0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
224d0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
224e0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
224f0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
22500 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
22510 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
22520 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
22530 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
22540 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
22550 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
22560 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
22570 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
22580 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
22590 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
225a0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
225b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
225c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
225d0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
225e0 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
225f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22620 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
22630 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
22640 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
22650 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
22660 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
22670 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
22680 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
22690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
226a0 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
226b0 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
226c0 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
226d0 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
226e0 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
226f0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
22700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
22710 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
22720 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
22730 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
22740 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
22750 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
22760 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
22770 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
22780 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
22790 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
227a0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
227b0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
227c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
227d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
227e0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
227f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
22800 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
22810 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
22820 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22840 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
22850 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
22860 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
22870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22880 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
22890 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
228a0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
228b0 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
228c0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
228d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
228e0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
228f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
22900 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
22910 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
22920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22930 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
22940 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
22950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
22960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
22980 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
22990 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
229a0 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
229b0 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
229c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
229d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
229e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
229f0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
22a00 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
22a10 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
22a20 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
22a30 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
22a40 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
22a50 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
22a60 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
22a70 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
22a80 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
22a90 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
22aa0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
22ab0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22ad0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
22ae0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
22af0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
22b00 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
22b10 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22b20 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
22b30 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
22b40 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
22b50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
22b60 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
22b70 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22b80 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
22b90 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
22ba0 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
22bb0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
22bc0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
22bd0 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
22be0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
22bf0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
22c00 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
22c10 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
22c20 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
22c30 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
22c40 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
22c50 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
22c60 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
22c70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22c80 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
22c90 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
22ca0 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
22cb0 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
22cc0 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
22cd0 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
22ce0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22cf0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
22d00 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
22d10 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
22d20 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
22d30 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
22d40 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
22d50 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
22d60 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
22d70 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
22d80 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
22d90 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
22da0 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
22db0 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
22dc0 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
22dd0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
22de0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
22df0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
22e00 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22e10 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
22e20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
22e30 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
22e40 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
22e50 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
22e60 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
22e70 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
22e80 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
22e90 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
22ea0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
22eb0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
22ec0 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
22ed0 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
22ee0 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
22ef0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
22f00 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
22f10 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
22f20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
22f30 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
22f40 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
22f50 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
22f60 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
22f70 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
22f80 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
22f90 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
22fa0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
22fb0 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
22fc0 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
22fd0 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
22fe0 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
22ff0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
23000 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
23010 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
23020 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
23030 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
23040 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
23050 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
23060 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
23070 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
23080 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
23090 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
230a0 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
230b0 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
230c0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
230d0 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
230e0 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
230f0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
23100 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
23110 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
23120 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
23130 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
23140 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
23150 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
23160 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
23170 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
23180 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23190 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
231a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
231b0 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
231c0 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
231d0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
231e0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
231f0 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
23200 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
23210 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
23220 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
23230 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
23240 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
23250 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
23260 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
23270 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
23280 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
23290 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
232a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
232b0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
232c0 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
232d0 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
232e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
232f0 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
23300 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
23310 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
23320 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
23330 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
23340 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
23350 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
23360 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
23370 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
23380 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
23390 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
233a0 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
233b0 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
233c0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
233d0 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
233e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
233f0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
23400 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
23410 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
23420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
23430 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
23440 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
23450 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
23460 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
23470 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23480 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
23490 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
234a0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
234b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
234c0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
234d0 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
234e0 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
234f0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
23500 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
23510 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
23520 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
23530 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
23540 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
23550 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
23560 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
23570 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
23580 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23590 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
235a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
235b0 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
235c0 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
235d0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
235e0 30 3b 0a 7d 0a                                   0;.}.