/ Hex Artifact Content
Login

Artifact 9ee3c0373bfc05dc8bf5307a4a92be6bea3055928c4846fdced7e708993b2d6d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  6.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75   contains code u
0190: 73 65 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65  se to manipulate
01a0: 20 22 4d 65 6d 22 20 73 74 72 75 63 74 75 72 65   "Mem" structure
01b0: 2e 20 20 41 20 22 4d 65 6d 22 0a 2a 2a 20 73 74  .  A "Mem".** st
01c0: 6f 72 65 73 20 61 20 73 69 6e 67 6c 65 20 76 61  ores a single va
01d0: 6c 75 65 20 69 6e 20 74 68 65 20 56 44 42 45 2e  lue in the VDBE.
01e0: 20 20 4d 65 6d 20 69 73 20 61 6e 20 6f 70 61 71    Mem is an opaq
01f0: 75 65 20 73 74 72 75 63 74 75 72 65 20 76 69 73  ue structure vis
0200: 69 62 6c 65 0a 2a 2a 20 6f 6e 6c 79 20 77 69 74  ible.** only wit
0210: 68 69 6e 20 74 68 65 20 56 44 42 45 2e 20 20 49  hin the VDBE.  I
0220: 6e 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65  nterface routine
0230: 73 20 72 65 66 65 72 20 74 6f 20 61 20 4d 65 6d  s refer to a Mem
0240: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 61   using the.** na
0250: 6d 65 20 73 71 6c 69 74 65 5f 76 61 6c 75 65 0a  me sqlite_value.
0260: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0270: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0280: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a  de "vdbeInt.h"..
0290: 2f 2a 20 54 72 75 65 20 69 66 20 58 20 69 73 20  /* True if X is 
02a0: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20  a power of two. 
02b0: 20 30 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64   0 is considered
02c0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
02d0: 68 65 72 65 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  here..** In othe
02e0: 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
02f0: 74 72 75 65 20 69 66 20 58 20 68 61 73 20 61 74  true if X has at
0300: 20 6d 6f 73 74 20 6f 6e 65 20 62 69 74 20 73 65   most one bit se
0310: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53  t..*/.#define IS
0320: 50 4f 57 45 52 4f 46 32 28 58 29 20 20 28 28 28  POWEROF2(X)  (((
0330: 58 29 26 28 28 58 29 2d 31 29 29 3d 3d 30 29 0a  X)&((X)-1))==0).
0340: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0350: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  EBUG./*.** Check
0360: 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 61   invariants on a
0370: 20 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   Mem object..**.
0380: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0390: 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
03a0: 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73  use inside of as
03b0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
03c0: 73 2c 20 6c 69 6b 65 0a 2a 2a 20 74 68 69 73 3a  s, like.** this:
03d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
03e0: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
03f0: 6e 76 61 72 69 61 6e 74 73 28 70 4d 65 6d 29 20  nvariants(pMem) 
0400: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
0410: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
0420: 61 72 69 61 6e 74 73 28 4d 65 6d 20 2a 70 29 7b  ariants(Mem *p){
0430: 0a 20 20 2f 2a 20 49 66 20 4d 45 4d 5f 44 79 6e  .  /* If MEM_Dyn
0440: 20 69 73 20 73 65 74 20 74 68 65 6e 20 4d 65 6d   is set then Mem
0450: 2e 78 44 65 6c 21 3d 30 2e 20 20 0a 20 20 2a 2a  .xDel!=0.  .  **
0460: 20 4d 65 6d 2e 78 44 65 6c 20 6d 69 67 68 74 20   Mem.xDel might 
0470: 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  not be initializ
0480: 65 64 20 69 66 20 4d 45 4d 5f 44 79 6e 20 69 73  ed if MEM_Dyn is
0490: 20 63 6c 65 61 72 2e 0a 20 20 2a 2f 0a 20 20 61   clear..  */.  a
04a0: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
04b0: 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 7c   & MEM_Dyn)==0 |
04c0: 7c 20 70 2d 3e 78 44 65 6c 21 3d 30 20 29 3b 0a  | p->xDel!=0 );.
04d0: 0a 20 20 2f 2a 20 4d 45 4d 5f 44 79 6e 20 6d 61  .  /* MEM_Dyn ma
04e0: 79 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66  y only be set if
04f0: 20 4d 65 6d 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30   Mem.szMalloc==0
0500: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 20 77  .  In this way w
0510: 65 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68  e.  ** ensure th
0520: 61 74 20 69 66 20 4d 65 6d 2e 73 7a 4d 61 6c 6c  at if Mem.szMall
0530: 6f 63 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  oc>0 then it is 
0540: 73 61 66 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20  safe to do.  ** 
0550: 4d 65 6d 2e 7a 20 3d 20 4d 65 6d 2e 7a 4d 61 6c  Mem.z = Mem.zMal
0560: 6c 6f 63 20 77 69 74 68 6f 75 74 20 68 61 76 69  loc without havi
0570: 6e 67 20 74 6f 20 63 68 65 63 6b 20 4d 65 6d 2e  ng to check Mem.
0580: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 2e 0a 20  flags&MEM_Dyn.. 
0590: 20 2a 2a 20 54 68 61 74 20 73 61 76 65 73 20 61   ** That saves a
05a0: 20 66 65 77 20 63 79 63 6c 65 73 20 69 6e 20 69   few cycles in i
05b0: 6e 6e 65 72 20 6c 6f 6f 70 73 2e 20 2a 2f 0a 20  nner loops. */. 
05c0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
05d0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30  gs & MEM_Dyn)==0
05e0: 20 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d   || p->szMalloc=
05f0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6e 6e  =0 );..  /* Cann
0600: 6f 74 20 68 61 76 65 20 6d 6f 72 65 20 74 68 61  ot have more tha
0610: 6e 20 6f 6e 65 20 6f 66 20 4d 45 4d 5f 49 6e 74  n one of MEM_Int
0620: 2c 20 4d 45 4d 5f 52 65 61 6c 2c 20 6f 72 20 4d  , MEM_Real, or M
0630: 45 4d 5f 49 6e 74 52 65 61 6c 20 2a 2f 0a 20 20  EM_IntReal */.  
0640: 61 73 73 65 72 74 28 20 49 53 50 4f 57 45 52 4f  assert( ISPOWERO
0650: 46 32 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d  F2(p->flags & (M
0660: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c  EM_Int|MEM_Real|
0670: 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 20 29 3b  MEM_IntReal)) );
0680: 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
0690: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
06a0: 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 62 65 20     /* Cannot be 
06b0: 62 6f 74 68 20 4d 45 4d 5f 4e 75 6c 6c 20 61 6e  both MEM_Null an
06c0: 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 79 70  d some other typ
06d0: 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
06e0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45   (p->flags & (ME
06f0: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
0700: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 7c  EM_Str|MEM_Blob|
0710: 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a  MEM_Agg))==0 );.
0720: 0a 20 20 20 20 2f 2a 20 49 66 20 4d 45 4d 5f 4e  .    /* If MEM_N
0730: 75 6c 6c 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ull is set, then
0740: 20 65 69 74 68 65 72 20 74 68 65 20 76 61 6c 75   either the valu
0750: 65 20 69 73 20 61 20 70 75 72 65 20 4e 55 4c 4c  e is a pure NULL
0760: 20 28 74 68 65 20 75 73 75 61 6c 0a 20 20 20 20   (the usual.    
0770: 2a 2a 20 63 61 73 65 29 20 6f 72 20 69 74 20 69  ** case) or it i
0780: 73 20 61 20 70 6f 69 6e 74 65 72 20 73 65 74 20  s a pointer set 
0790: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 69  using sqlite3_bi
07a0: 6e 64 5f 70 6f 69 6e 74 65 72 28 29 20 6f 72 0a  nd_pointer() or.
07b0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 72      ** sqlite3_r
07c0: 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72 28 29 2e  esult_pointer().
07d0: 20 20 49 66 20 61 20 70 6f 69 6e 74 65 72 2c 20    If a pointer, 
07e0: 74 68 65 6e 20 4d 45 4d 5f 54 65 72 6d 20 6d 75  then MEM_Term mu
07f0: 73 74 20 61 6c 73 6f 20 62 65 0a 20 20 20 20 2a  st also be.    *
0800: 2a 20 73 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  * set..    */.  
0810: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0820: 26 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f  & (MEM_Term|MEM_
0830: 53 75 62 74 79 70 65 29 29 3d 3d 28 4d 45 4d 5f  Subtype))==(MEM_
0840: 54 65 72 6d 7c 4d 45 4d 5f 53 75 62 74 79 70 65  Term|MEM_Subtype
0850: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
0860: 69 73 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  is is a pointer 
0870: 74 79 70 65 2e 20 20 54 68 65 72 65 20 6d 61 79  type.  There may
0880: 20 62 65 20 61 20 66 6c 61 67 20 74 6f 20 69 6e   be a flag to in
0890: 64 69 63 61 74 65 20 77 68 61 74 20 74 6f 0a 20  dicate what to. 
08a0: 20 20 20 20 20 2a 2a 20 64 6f 20 77 69 74 68 20       ** do with 
08b0: 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a  the pointer. */.
08c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28        assert( ((
08d0: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  p->flags&MEM_Dyn
08e0: 29 21 3d 30 20 3f 20 31 20 3a 20 30 29 20 2b 0a  )!=0 ? 1 : 0) +.
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
0900: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45 70 68  p->flags&MEM_Eph
0910: 65 6d 29 21 3d 30 20 3f 20 31 20 3a 20 30 29 20  em)!=0 ? 1 : 0) 
0920: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
0930: 28 28 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  ((p->flags&MEM_S
0940: 74 61 74 69 63 29 21 3d 30 20 3f 20 31 20 3a 20  tatic)!=0 ? 1 : 
0950: 30 29 20 3c 3d 20 31 20 29 3b 0a 0a 20 20 20 20  0) <= 1 );..    
0960: 20 20 2f 2a 20 4e 6f 20 6f 74 68 65 72 20 62 69    /* No other bi
0970: 74 73 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  ts set */.      
0980: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
0990: 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d  s & ~(MEM_Null|M
09a0: 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 75 62 74  EM_Term|MEM_Subt
09b0: 79 70 65 7c 4d 45 4d 5f 46 72 6f 6d 42 69 6e 64  ype|MEM_FromBind
09c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 4d 45 4d              |MEM
09e0: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 7c 4d  _Dyn|MEM_Ephem|M
09f0: 45 4d 5f 53 74 61 74 69 63 29 29 3d 3d 30 20 29  EM_Static))==0 )
0a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0a10: 20 20 20 2f 2a 20 41 20 70 75 72 65 20 4e 55 4c     /* A pure NUL
0a20: 4c 20 6d 69 67 68 74 20 68 61 76 65 20 6f 74 68  L might have oth
0a30: 65 72 20 66 6c 61 67 73 2c 20 73 75 63 68 20 61  er flags, such a
0a40: 73 20 4d 45 4d 5f 53 74 61 74 69 63 2c 20 4d 45  s MEM_Static, ME
0a50: 4d 5f 44 79 6e 2c 0a 20 20 20 20 20 20 2a 2a 20  M_Dyn,.      ** 
0a60: 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 43  MEM_Ephem, MEM_C
0a70: 6c 65 61 72 65 64 2c 20 6f 72 20 4d 45 4d 5f 53  leared, or MEM_S
0a80: 75 62 74 79 70 65 20 2a 2f 0a 20 20 20 20 7d 0a  ubtype */.    }.
0a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
0aa0: 54 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20  The MEM_Cleared 
0ab0: 62 69 74 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  bit is only allo
0ac0: 77 65 64 20 6f 6e 20 4e 55 4c 4c 73 20 2a 2f 0a  wed on NULLs */.
0ad0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
0ae0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 43 6c 65 61  flags & MEM_Clea
0af0: 72 65 64 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  red)==0 );.  }..
0b00: 20 20 2f 2a 20 54 68 65 20 73 7a 4d 61 6c 6c 6f    /* The szMallo
0b10: 63 20 66 69 65 6c 64 20 68 6f 6c 64 73 20 74 68  c field holds th
0b20: 65 20 63 6f 72 72 65 63 74 20 6d 65 6d 6f 72 79  e correct memory
0b30: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
0b40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
0b50: 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 0a 20 20 20  >szMalloc==0.   
0b60: 20 20 20 20 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c      || p->szMall
0b70: 6f 63 3d 3d 73 71 6c 69 74 65 33 44 62 4d 61 6c  oc==sqlite3DbMal
0b80: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 70 2d  locSize(p->db,p-
0b90: 3e 7a 4d 61 6c 6c 6f 63 29 20 29 3b 0a 0a 20 20  >zMalloc) );..  
0ba0: 2f 2a 20 49 66 20 70 20 68 6f 6c 64 73 20 61 20  /* If p holds a 
0bb0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20  string or blob, 
0bc0: 74 68 65 20 4d 65 6d 2e 7a 20 6d 75 73 74 20 70  the Mem.z must p
0bd0: 6f 69 6e 74 20 74 6f 20 65 78 61 63 74 6c 79 0a  oint to exactly.
0be0: 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
0bf0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
0c00: 20 20 2a 2a 20 20 20 28 31 29 20 4d 65 6d 6f 72    **   (1) Memor
0c10: 79 20 69 6e 20 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63  y in Mem.zMalloc
0c20: 20 61 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20   and managed by 
0c30: 74 68 65 20 4d 65 6d 20 6f 62 6a 65 63 74 0a 20  the Mem object. 
0c40: 20 2a 2a 20 20 20 28 32 29 20 4d 65 6d 6f 72 79   **   (2) Memory
0c50: 20 74 6f 20 62 65 20 66 72 65 65 64 20 75 73 69   to be freed usi
0c60: 6e 67 20 4d 65 6d 2e 78 44 65 6c 0a 20 20 2a 2a  ng Mem.xDel.  **
0c70: 20 20 20 28 33 29 20 41 6e 20 65 70 68 65 6d 65     (3) An epheme
0c80: 72 61 6c 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  ral string or bl
0c90: 6f 62 0a 20 20 2a 2a 20 20 20 28 34 29 20 41 20  ob.  **   (4) A 
0ca0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 6f 72  static string or
0cb0: 20 62 6c 6f 62 0a 20 20 2a 2f 0a 20 20 69 66 28   blob.  */.  if(
0cc0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45   (p->flags & (ME
0cd0: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29  M_Str|MEM_Blob))
0ce0: 20 26 26 20 70 2d 3e 6e 3e 30 20 29 7b 0a 20 20   && p->n>0 ){.  
0cf0: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
0d00: 20 28 28 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30   ((p->szMalloc>0
0d10: 20 26 26 20 70 2d 3e 7a 3d 3d 70 2d 3e 7a 4d 61   && p->z==p->zMa
0d20: 6c 6c 6f 63 29 3f 20 31 20 3a 20 30 29 20 2b 0a  lloc)? 1 : 0) +.
0d30: 20 20 20 20 20 20 28 28 70 2d 3e 66 6c 61 67 73        ((p->flags
0d40: 26 4d 45 4d 5f 44 79 6e 29 21 3d 30 20 3f 20 31  &MEM_Dyn)!=0 ? 1
0d50: 20 3a 20 30 29 20 2b 0a 20 20 20 20 20 20 28 28   : 0) +.      ((
0d60: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45 70 68  p->flags&MEM_Eph
0d70: 65 6d 29 21 3d 30 20 3f 20 31 20 3a 20 30 29 20  em)!=0 ? 1 : 0) 
0d80: 2b 0a 20 20 20 20 20 20 28 28 70 2d 3e 66 6c 61  +.      ((p->fla
0d90: 67 73 26 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d  gs&MEM_Static)!=
0da0: 30 20 3f 20 31 20 3a 20 30 29 20 3d 3d 20 31 0a  0 ? 1 : 0) == 1.
0db0: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
0dc0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0dd0: 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61 20  ./*.** Render a 
0de0: 4d 65 6d 20 6f 62 6a 65 63 74 20 77 68 69 63 68  Mem object which
0df0: 20 69 73 20 6f 6e 65 20 6f 66 20 4d 45 4d 5f 49   is one of MEM_I
0e00: 6e 74 2c 20 4d 45 4d 5f 52 65 61 6c 2c 20 6f 72  nt, MEM_Real, or
0e10: 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 0a 2a 2a 20   MEM_IntReal.** 
0e20: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  into a buffer..*
0e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
0e40: 62 65 4d 65 6d 52 65 6e 64 65 72 4e 75 6d 28 69  beMemRenderNum(i
0e50: 6e 74 20 73 7a 2c 20 63 68 61 72 20 2a 7a 42 75  nt sz, char *zBu
0e60: 66 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 53 74  f, Mem *p){.  St
0e70: 72 41 63 63 75 6d 20 61 63 63 3b 0a 20 20 61 73  rAccum acc;.  as
0e80: 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20 26  sert( p->flags &
0e90: 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
0ea0: 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20  al|MEM_IntReal) 
0eb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
0ec0: 63 63 75 6d 49 6e 69 74 28 26 61 63 63 2c 20 30  ccumInit(&acc, 0
0ed0: 2c 20 7a 42 75 66 2c 20 73 7a 2c 20 30 29 3b 0a  , zBuf, sz, 0);.
0ee0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
0ef0: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
0f00: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
0f10: 6e 64 66 28 26 61 63 63 2c 20 22 25 6c 6c 64 22  ndf(&acc, "%lld"
0f20: 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c  , p->u.i);.  }el
0f30: 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  se if( p->flags 
0f40: 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 7b  & MEM_IntReal ){
0f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
0f60: 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c 20 22  _appendf(&acc, "
0f70: 25 21 2e 31 35 67 22 2c 20 28 64 6f 75 62 6c 65  %!.15g", (double
0f80: 29 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73  )p->u.i);.  }els
0f90: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
0fa0: 74 72 5f 61 70 70 65 6e 64 66 28 26 61 63 63 2c  tr_appendf(&acc,
0fb0: 20 22 25 21 2e 31 35 67 22 2c 20 70 2d 3e 75 2e   "%!.15g", p->u.
0fc0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
0fd0: 28 20 61 63 63 2e 7a 54 65 78 74 3d 3d 7a 42 75  ( acc.zText==zBu
0fe0: 66 20 26 26 20 61 63 63 2e 6d 78 41 6c 6c 6f 63  f && acc.mxAlloc
0ff0: 3c 3d 30 20 29 3b 0a 20 20 7a 42 75 66 5b 61 63  <=0 );.  zBuf[ac
1000: 63 2e 6e 43 68 61 72 5d 20 3d 20 30 3b 20 2f 2a  c.nChar] = 0; /*
1010: 20 46 61 73 74 20 76 65 72 73 69 6f 6e 20 6f 66   Fast version of
1020: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1030: 46 69 6e 69 73 68 28 26 61 63 63 29 20 2a 2f 0a  Finish(&acc) */.
1040: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1050: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 56 61 6c  _DEBUG./*.** Val
1060: 69 64 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20  idity checks on 
1070: 70 4d 65 6d 2e 20 20 70 4d 65 6d 20 68 6f 6c 64  pMem.  pMem hold
1080: 73 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  s a string..**.*
1090: 2a 20 28 31 29 20 43 68 65 63 6b 20 74 68 61 74  * (1) Check that
10a0: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66   string value of
10b0: 20 70 4d 65 6d 20 61 67 72 65 65 73 20 77 69 74   pMem agrees wit
10c0: 68 20 69 74 73 20 69 6e 74 65 67 65 72 20 6f 72  h its integer or
10d0: 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 20   real value..** 
10e0: 28 32 29 20 43 68 65 63 6b 20 74 68 61 74 20 74  (2) Check that t
10f0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 63 6f 72  he string is cor
1100: 72 65 63 74 6c 79 20 7a 65 72 6f 20 74 65 72 6d  rectly zero term
1110: 69 6e 61 74 65 64 0a 2a 2a 0a 2a 2a 20 41 20 73  inated.**.** A s
1120: 69 6e 67 6c 65 20 69 6e 74 20 6f 72 20 72 65 61  ingle int or rea
1130: 6c 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63  l value always c
1140: 6f 6e 76 65 72 74 73 20 74 6f 20 74 68 65 20 73  onverts to the s
1150: 61 6d 65 20 73 74 72 69 6e 67 73 2e 20 20 42 75  ame strings.  Bu
1160: 74 0a 2a 2a 20 6d 61 6e 79 20 64 69 66 66 65 72  t.** many differ
1170: 65 6e 74 20 73 74 72 69 6e 67 73 20 63 61 6e 20  ent strings can 
1180: 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1190: 6f 20 74 68 65 20 73 61 6d 65 20 69 6e 74 20 6f  o the same int o
11a0: 72 20 72 65 61 6c 2e 0a 2a 2a 20 49 66 20 61 20  r real..** If a 
11b0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  table contains a
11c0: 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 61   numeric value a
11d0: 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20 62  nd an index is b
11e0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
11f0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
1200: 69 6e 67 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ing value, then 
1210: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
1220: 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20  that the string 
1230: 62 65 0a 2a 2a 20 64 65 72 69 76 65 64 20 66 72  be.** derived fr
1240: 6f 6d 20 74 68 65 20 6e 75 6d 65 72 69 63 20 76  om the numeric v
1250: 61 6c 75 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74  alue, not the ot
1260: 68 65 72 20 77 61 79 20 61 72 6f 75 6e 64 2c 20  her way around, 
1270: 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
1280: 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  t the index and 
1290: 74 61 62 6c 65 20 61 72 65 20 63 6f 6e 73 69 73  table are consis
12a0: 74 65 6e 74 2e 20 20 53 65 65 20 74 69 63 6b 65  tent.  See ticke
12b0: 74 0a 2a 2a 20 68 74 74 70 73 3a 2f 2f 77 77 77  t.** https://www
12c0: 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
12d0: 69 6e 66 6f 2f 33 34 33 36 33 34 39 34 32 64 64  info/343634942dd
12e0: 35 34 61 62 20 28 32 30 31 38 2d 30 31 2d 33 31  54ab (2018-01-31
12f0: 29 20 66 6f 72 0a 2a 2a 20 61 6e 20 65 78 61 6d  ) for.** an exam
1300: 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ple..**.** This 
1310: 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 74  routine looks at
1320: 20 70 4d 65 6d 20 74 6f 20 76 65 72 69 66 79 20   pMem to verify 
1330: 74 68 61 74 20 69 66 20 69 74 20 68 61 73 20 62  that if it has b
1340: 6f 74 68 20 61 20 6e 75 6d 65 72 69 63 0a 2a 2a  oth a numeric.**
1350: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1360: 61 6e 64 20 61 20 73 74 72 69 6e 67 20 72 65 70  and a string rep
1370: 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 68 65 6e  resentation then
1380: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 20   the string rep 
1390: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 64 65 72 69  has.** been deri
13a0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 75 6d  ved from the num
13b0: 65 72 69 63 20 61 6e 64 20 6e 6f 74 20 74 68 65  eric and not the
13c0: 20 6f 74 68 65 72 20 77 61 79 20 61 72 6f 75 6e   other way aroun
13d0: 64 2e 20 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  d.  It returns.*
13e0: 2a 20 74 72 75 65 20 69 66 20 65 76 65 72 79 74  * true if everyt
13f0: 68 69 6e 67 20 69 73 20 6f 6b 20 61 6e 64 20 66  hing is ok and f
1400: 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
1410: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2a 0a 2a   a problem..**.*
1420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1430: 73 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65  s for use inside
1440: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
1450: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f  tements only..*/
1460: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1470: 4d 65 6d 56 61 6c 69 64 53 74 72 52 65 70 28 4d  MemValidStrRep(M
1480: 65 6d 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 7a  em *p){.  char z
1490: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72  Buf[100];.  char
14a0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c   *z;.  int i, j,
14b0: 20 69 6e 63 72 3b 0a 20 20 69 66 28 20 28 70 2d   incr;.  if( (p-
14c0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
14d0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
14e0: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
14f0: 26 20 4d 45 4d 5f 54 65 72 6d 20 29 7b 0a 20 20  & MEM_Term ){.  
1500: 20 20 2f 2a 20 49 6e 73 75 72 65 20 74 68 61 74    /* Insure that
1510: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 70   the string is p
1520: 72 6f 70 65 72 6c 79 20 7a 65 72 6f 2d 74 65 72  roperly zero-ter
1530: 6d 69 6e 61 74 65 64 2e 20 20 50 61 79 20 70 61  minated.  Pay pa
1540: 72 74 69 63 75 6c 61 72 0a 20 20 20 20 2a 2a 20  rticular.    ** 
1550: 61 74 74 65 6e 74 69 6f 6e 20 74 6f 20 74 68 65  attention to the
1560: 20 63 61 73 65 20 77 68 65 72 65 20 70 2d 3e 6e   case where p->n
1570: 20 69 73 20 6f 64 64 20 2a 2f 0a 20 20 20 20 69   is odd */.    i
1580: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30  f( p->szMalloc>0
1590: 20 26 26 20 70 2d 3e 7a 3d 3d 70 2d 3e 7a 4d 61   && p->z==p->zMa
15a0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 61 73  lloc ){.      as
15b0: 73 65 72 74 28 20 70 2d 3e 65 6e 63 3d 3d 53 51  sert( p->enc==SQ
15c0: 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 70 2d 3e  LITE_UTF8 || p->
15d0: 73 7a 4d 61 6c 6c 6f 63 20 3e 3d 20 28 28 70 2d  szMalloc >= ((p-
15e0: 3e 6e 2b 31 29 26 7e 31 29 2b 32 20 29 3b 0a 20  >n+1)&~1)+2 );. 
15f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1600: 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
1610: 20 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20   || p->szMalloc 
1620: 3e 3d 20 70 2d 3e 6e 2b 31 20 29 3b 0a 20 20 20  >= p->n+1 );.   
1630: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1640: 2d 3e 7a 5b 70 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a  ->z[p->n]==0 );.
1650: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
1660: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1670: 7c 7c 20 70 2d 3e 7a 5b 28 70 2d 3e 6e 2b 31 29  || p->z[(p->n+1)
1680: 26 7e 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 61  &~1]==0 );.    a
1690: 73 73 65 72 74 28 20 70 2d 3e 65 6e 63 3d 3d 53  ssert( p->enc==S
16a0: 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 70 2d  QLITE_UTF8 || p-
16b0: 3e 7a 5b 28 28 70 2d 3e 6e 2b 31 29 26 7e 31 29  >z[((p->n+1)&~1)
16c0: 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  +1]==0 );.  }.  
16d0: 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
16e0: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
16f0: 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d  l|MEM_IntReal))=
1700: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1710: 20 76 64 62 65 4d 65 6d 52 65 6e 64 65 72 4e 75   vdbeMemRenderNu
1720: 6d 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  m(sizeof(zBuf), 
1730: 7a 42 75 66 2c 20 70 29 3b 0a 20 20 7a 20 3d 20  zBuf, p);.  z = 
1740: 70 2d 3e 7a 3b 0a 20 20 69 20 3d 20 6a 20 3d 20  p->z;.  i = j = 
1750: 30 3b 0a 20 20 69 6e 63 72 20 3d 20 31 3b 0a 20  0;.  incr = 1;. 
1760: 20 69 66 28 20 70 2d 3e 65 6e 63 21 3d 53 51 4c   if( p->enc!=SQL
1770: 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20  ITE_UTF8 ){.    
1780: 69 6e 63 72 20 3d 20 32 3b 0a 20 20 20 20 69 66  incr = 2;.    if
1790: 28 20 70 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  ( p->enc==SQLITE
17a0: 5f 55 54 46 31 36 42 45 20 29 20 7a 2b 2b 3b 0a  _UTF16BE ) z++;.
17b0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a 42 75    }.  while( zBu
17c0: 66 5b 6a 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  f[j] ){.    if( 
17d0: 7a 42 75 66 5b 6a 2b 2b 5d 21 3d 7a 5b 69 5d 20  zBuf[j++]!=z[i] 
17e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17f0: 69 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 7d 0a 20  i += incr;.  }. 
1800: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1810: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
1820: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BUG */../*.** If
1830: 20 70 4d 65 6d 20 69 73 20 61 6e 20 6f 62 6a 65   pMem is an obje
1840: 63 74 20 77 69 74 68 20 61 20 76 61 6c 69 64 20  ct with a valid 
1850: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
1860: 61 74 69 6f 6e 2c 20 74 68 69 73 20 72 6f 75 74  ation, this rout
1870: 69 6e 65 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74  ine.** ensures t
1880: 68 65 20 69 6e 74 65 72 6e 61 6c 20 65 6e 63 6f  he internal enco
1890: 64 69 6e 67 20 66 6f 72 20 74 68 65 20 73 74 72  ding for the str
18a0: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
18b0: 6f 6e 20 69 73 0a 2a 2a 20 27 64 65 73 69 72 65  on is.** 'desire
18c0: 64 45 6e 63 27 2c 20 6f 6e 65 20 6f 66 20 53 51  dEnc', one of SQ
18d0: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
18e0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
18f0: 49 54 45 5f 55 54 46 31 36 42 45 2e 0a 2a 2a 0a  ITE_UTF16BE..**.
1900: 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 6e 6f  ** If pMem is no
1910: 74 20 61 20 73 74 72 69 6e 67 20 6f 62 6a 65 63  t a string objec
1920: 74 2c 20 6f 72 20 74 68 65 20 65 6e 63 6f 64 69  t, or the encodi
1930: 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ng of the string
1940: 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
1950: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 73 74  on is already st
1960: 6f 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 72  ored using the r
1970: 65 71 75 65 73 74 65 64 20 65 6e 63 6f 64 69 6e  equested encodin
1980: 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  g, then this.** 
1990: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
19a0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
19b0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
19c0: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
19d0: 6e 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  n is successful 
19e0: 28 6f 72 20 6e 6f 74 20 72 65 71 75 69 72 65 64  (or not required
19f0: 29 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  )..** SQLITE_NOM
1a00: 45 4d 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  EM may be return
1a10: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1a20: 20 66 61 69 6c 73 20 64 75 72 69 6e 67 20 63 6f   fails during co
1a30: 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 62 65 74 77  nversion.** betw
1a40: 65 65 6e 20 66 6f 72 6d 61 74 73 2e 0a 2a 2f 0a  een formats..*/.
1a50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
1a60: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 4d 65  hangeEncoding(Me
1a70: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 64 65 73  m *pMem, int des
1a80: 69 72 65 64 45 6e 63 29 7b 0a 23 69 66 6e 64 65  iredEnc){.#ifnde
1a90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1aa0: 46 31 36 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65  F16.  int rc;.#e
1ab0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 21  ndif.  assert( !
1ac0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73  sqlite3VdbeMemIs
1ad0: 52 6f 77 53 65 74 28 70 4d 65 6d 29 20 29 3b 0a  RowSet(pMem) );.
1ae0: 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
1af0: 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  dEnc==SQLITE_UTF
1b00: 38 20 7c 7c 20 64 65 73 69 72 65 64 45 6e 63 3d  8 || desiredEnc=
1b10: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 0a  =SQLITE_UTF16LE.
1b20: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64 65             || de
1b30: 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45  siredEnc==SQLITE
1b40: 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66  _UTF16BE );.  if
1b50: 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  ( !(pMem->flags&
1b60: 4d 45 4d 5f 53 74 72 29 20 7c 7c 20 70 4d 65 6d  MEM_Str) || pMem
1b70: 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64 45 6e  ->enc==desiredEn
1b80: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1b90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ba0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
1bb0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
1bc0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
1bd0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 23  >db->mutex) );.#
1be0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1bf0: 54 5f 55 54 46 31 36 0a 20 20 72 65 74 75 72 6e  T_UTF16.  return
1c00: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23   SQLITE_ERROR;.#
1c10: 65 6c 73 65 0a 0a 20 20 2f 2a 20 4d 65 6d 54 72  else..  /* MemTr
1c20: 61 6e 73 6c 61 74 65 28 29 20 6d 61 79 20 72 65  anslate() may re
1c30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1c40: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  r SQLITE_NOMEM. 
1c50: 49 66 20 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  If NOMEM is retu
1c60: 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  rned,.  ** then 
1c70: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
1c80: 74 68 65 20 76 61 6c 75 65 20 6d 61 79 20 6e 6f  the value may no
1c90: 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  t have changed..
1ca0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1cb0: 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c  te3VdbeMemTransl
1cc0: 61 74 65 28 70 4d 65 6d 2c 20 28 75 38 29 64 65  ate(pMem, (u8)de
1cd0: 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 61 73 73  siredEnc);.  ass
1ce0: 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1cf0: 4b 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  K    || rc==SQLI
1d00: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 61 73 73  TE_NOMEM);.  ass
1d10: 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1d20: 4b 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 65 6e  K    || pMem->en
1d30: 63 21 3d 64 65 73 69 72 65 64 45 6e 63 29 3b 0a  c!=desiredEnc);.
1d40: 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1d50: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 4d 65  ITE_NOMEM || pMe
1d60: 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64 45  m->enc==desiredE
1d70: 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
1d80: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
1d90: 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 4d 65 6d  * Make sure pMem
1da0: 2d 3e 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ->z points to a 
1db0: 77 72 69 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  writable allocat
1dc0: 69 6f 6e 20 6f 66 20 61 74 20 6c 65 61 73 74 20  ion of at least 
1dd0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  n bytes..**.** I
1de0: 66 20 74 68 65 20 62 50 72 65 73 65 72 76 65 20  f the bPreserve 
1df0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
1e00: 2c 20 74 68 65 6e 20 63 6f 70 79 20 6f 66 20 74  , then copy of t
1e10: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
1e20: 20 70 4d 65 6d 2d 3e 7a 20 69 6e 74 6f 20 74 68   pMem->z into th
1e30: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1e40: 2e 20 20 70 4d 65 6d 20 6d 75 73 74 20 62 65 20  .  pMem must be 
1e50: 65 69 74 68 65 72 20 61 20 73 74 72 69 6e 67 20  either a string 
1e60: 6f 72 0a 2a 2a 20 62 6c 6f 62 20 69 66 20 62 50  or.** blob if bP
1e70: 72 65 73 65 72 76 65 20 69 73 20 74 72 75 65 2e  reserve is true.
1e80: 20 20 49 66 20 62 50 72 65 73 65 72 76 65 20 69    If bPreserve i
1e90: 73 20 66 61 6c 73 65 2c 20 61 6e 79 20 70 72 69  s false, any pri
1ea0: 6f 72 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 69 6e  or content.** in
1eb0: 20 70 4d 65 6d 2d 3e 7a 20 69 73 20 64 69 73 63   pMem->z is disc
1ec0: 61 72 64 65 64 2e 0a 2a 2f 0a 53 51 4c 49 54 45  arded..*/.SQLITE
1ed0: 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1ee0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
1ef0: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
1f00: 6e 2c 20 69 6e 74 20 62 50 72 65 73 65 72 76 65  n, int bPreserve
1f10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1f20: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
1f30: 49 6e 76 61 72 69 61 6e 74 73 28 70 4d 65 6d 29  Invariants(pMem)
1f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
1f50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
1f60: 6f 77 53 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20  owSet(pMem) );. 
1f70: 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1f80: 3e 64 62 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db==0 );..  /* 
1f90: 49 66 20 74 68 65 20 62 50 72 65 73 65 72 76 65  If the bPreserve
1fa0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
1fb0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  true, then the m
1fc0: 65 6d 6f 72 79 20 63 65 6c 6c 20 6d 75 73 74 20  emory cell must 
1fd0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 63 6f 6e  already.  ** con
1fe0: 74 61 69 6e 20 61 20 76 61 6c 69 64 20 73 74 72  tain a valid str
1ff0: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ing or blob valu
2000: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
2010: 20 62 50 72 65 73 65 72 76 65 3d 3d 30 20 7c 7c   bPreserve==0 ||
2020: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 28 4d 45   pMem->flags&(ME
2030: 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20  M_Blob|MEM_Str) 
2040: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 62  );.  testcase( b
2050: 50 72 65 73 65 72 76 65 20 26 26 20 70 4d 65 6d  Preserve && pMem
2060: 2d 3e 7a 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73  ->z==0 );..  ass
2070: 65 72 74 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  ert( pMem->szMal
2080: 6c 6f 63 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  loc==0.       ||
2090: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d   pMem->szMalloc=
20a0: 3d 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  =sqlite3DbMalloc
20b0: 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  Size(pMem->db, p
20c0: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 3b  Mem->zMalloc) );
20d0: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 73 7a 4d  .  if( pMem->szM
20e0: 61 6c 6c 6f 63 3e 30 20 26 26 20 62 50 72 65 73  alloc>0 && bPres
20f0: 65 72 76 65 20 26 26 20 70 4d 65 6d 2d 3e 7a 3d  erve && pMem->z=
2100: 3d 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  =pMem->zMalloc )
2110: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  {.    pMem->z = 
2120: 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pMem->zMalloc = 
2130: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
2140: 4f 72 46 72 65 65 28 70 4d 65 6d 2d 3e 64 62 2c  OrFree(pMem->db,
2150: 20 70 4d 65 6d 2d 3e 7a 2c 20 6e 29 3b 0a 20 20   pMem->z, n);.  
2160: 20 20 62 50 72 65 73 65 72 76 65 20 3d 20 30 3b    bPreserve = 0;
2170: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2180: 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  ( pMem->szMalloc
2190: 3e 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  >0 ) sqlite3DbFr
21a0: 65 65 4e 4e 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  eeNN(pMem->db, p
21b0: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  Mem->zMalloc);. 
21c0: 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
21d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
21e0: 6f 63 52 61 77 28 70 4d 65 6d 2d 3e 64 62 2c 20  ocRaw(pMem->db, 
21f0: 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  n);.  }.  if( pM
2200: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em->zMalloc==0 )
2210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2220: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
2230: 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  );.    pMem->z =
2240: 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a   0;.    pMem->sz
2250: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
2260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2270: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
2280: 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  e{.    pMem->szM
2290: 61 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  alloc = sqlite3D
22a0: 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d  bMallocSize(pMem
22b0: 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ->db, pMem->zMal
22c0: 6c 6f 63 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  loc);.  }..  if(
22d0: 20 62 50 72 65 73 65 72 76 65 20 26 26 20 70 4d   bPreserve && pM
22e0: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73  em->z ){.    ass
22f0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d  ert( pMem->z!=pM
2300: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  em->zMalloc );. 
2310: 20 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e     memcpy(pMem->
2320: 7a 4d 61 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e 7a  zMalloc, pMem->z
2330: 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 7d 0a  , pMem->n);.  }.
2340: 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61    if( (pMem->fla
2350: 67 73 26 4d 45 4d 5f 44 79 6e 29 21 3d 30 20 29  gs&MEM_Dyn)!=0 )
2360: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
2370: 65 6d 2d 3e 78 44 65 6c 21 3d 30 20 26 26 20 70  em->xDel!=0 && p
2380: 4d 65 6d 2d 3e 78 44 65 6c 21 3d 53 51 4c 49 54  Mem->xDel!=SQLIT
2390: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
23a0: 20 70 4d 65 6d 2d 3e 78 44 65 6c 28 28 76 6f 69   pMem->xDel((voi
23b0: 64 20 2a 29 28 70 4d 65 6d 2d 3e 7a 29 29 3b 0a  d *)(pMem->z));.
23c0: 20 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d    }..  pMem->z =
23d0: 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a   pMem->zMalloc;.
23e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d    pMem->flags &=
23f0: 20 7e 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45   ~(MEM_Dyn|MEM_E
2400: 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29  phem|MEM_Static)
2410: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2420: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2430: 68 61 6e 67 65 20 74 68 65 20 70 4d 65 6d 2d 3e  hange the pMem->
2440: 7a 4d 61 6c 6c 6f 63 20 61 6c 6c 6f 63 61 74 69  zMalloc allocati
2450: 6f 6e 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  on to be at leas
2460: 74 20 73 7a 4e 65 77 20 62 79 74 65 73 2e 0a 2a  t szNew bytes..*
2470: 2a 20 49 66 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  * If pMem->zMall
2480: 6f 63 20 61 6c 72 65 61 64 79 20 6d 65 65 74 73  oc already meets
2490: 20 6f 72 20 65 78 63 65 65 64 73 20 74 68 65 20   or exceeds the 
24a0: 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 2c 20  requested size, 
24b0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
24c0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
24d0: 2a 20 41 6e 79 20 70 72 69 6f 72 20 73 74 72 69  * Any prior stri
24e0: 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 74 65  ng or blob conte
24f0: 6e 74 20 69 6e 20 74 68 65 20 70 4d 65 6d 20 6f  nt in the pMem o
2500: 62 6a 65 63 74 20 6d 61 79 20 62 65 20 64 69 73  bject may be dis
2510: 63 61 72 64 65 64 2e 0a 2a 2a 20 54 68 65 20 70  carded..** The p
2520: 4d 65 6d 2d 3e 78 44 65 6c 20 64 65 73 74 72 75  Mem->xDel destru
2530: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 2c 20  ctor is called, 
2540: 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 54  if it exists.  T
2550: 68 6f 75 67 68 20 4d 45 4d 5f 53 74 72 0a 2a 2a  hough MEM_Str.**
2560: 20 61 6e 64 20 4d 45 4d 5f 42 6c 6f 62 20 76 61   and MEM_Blob va
2570: 6c 75 65 73 20 6d 61 79 20 62 65 20 64 69 73 63  lues may be disc
2580: 61 72 64 65 64 2c 20 4d 45 4d 5f 49 6e 74 2c 20  arded, MEM_Int, 
2590: 4d 45 4d 5f 52 65 61 6c 2c 20 4d 45 4d 5f 49 6e  MEM_Real, MEM_In
25a0: 74 52 65 61 6c 2c 0a 2a 2a 20 61 6e 64 20 4d 45  tReal,.** and ME
25b0: 4d 5f 4e 75 6c 6c 20 76 61 6c 75 65 73 20 61 72  M_Null values ar
25c0: 65 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  e preserved..**.
25d0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
25e0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
25f0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
2600: 28 70 72 6f 62 61 62 6c 79 20 53 51 4c 49 54 45  (probably SQLITE
2610: 5f 4e 4f 4d 45 4d 29 0a 2a 2a 20 69 66 20 75 6e  _NOMEM).** if un
2620: 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
2630: 20 74 68 65 20 72 65 73 69 7a 69 6e 67 2e 0a 2a   the resizing..*
2640: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2650: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
2660: 7a 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  ze(Mem *pMem, in
2670: 74 20 73 7a 4e 65 77 29 7b 0a 20 20 61 73 73 65  t szNew){.  asse
2680: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
2690: 7c 20 73 7a 4e 65 77 3e 30 20 29 3b 0a 20 20 61  | szNew>0 );.  a
26a0: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
26b0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d  ags & MEM_Dyn)==
26c0: 30 20 7c 7c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  0 || pMem->szMal
26d0: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  loc==0 );.  if( 
26e0: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3c 73  pMem->szMalloc<s
26f0: 7a 4e 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75  zNew ){.    retu
2700: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  rn sqlite3VdbeMe
2710: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 73 7a 4e 65  mGrow(pMem, szNe
2720: 77 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 73 73  w, 0);.  }.  ass
2730: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
2740: 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20  s & MEM_Dyn)==0 
2750: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70  );.  pMem->z = p
2760: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20  Mem->zMalloc;.  
2770: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 28  pMem->flags &= (
2780: 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 49 6e 74  MEM_Null|MEM_Int
2790: 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  |MEM_Real|MEM_In
27a0: 74 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  tReal);.  return
27b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27c0: 2a 0a 2a 2a 20 49 74 20 69 73 20 61 6c 72 65 61  *.** It is alrea
27d0: 64 79 20 6b 6e 6f 77 6e 20 74 68 61 74 20 70 4d  dy known that pM
27e0: 65 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75  em contains an u
27f0: 6e 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  nterminated stri
2800: 6e 67 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 7a  ng..** Add the z
2810: 65 72 6f 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ero terminator..
2820: 2a 2a 0a 2a 2a 20 54 68 72 65 65 20 62 79 74 65  **.** Three byte
2830: 73 20 6f 66 20 7a 65 72 6f 20 61 72 65 20 61 64  s of zero are ad
2840: 64 65 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ded.  In this wa
2850: 79 2c 20 74 68 65 72 65 20 69 73 20 67 75 61 72  y, there is guar
2860: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
2870: 61 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 62 79  a double-zero by
2880: 74 65 20 61 74 20 61 6e 20 65 76 65 6e 20 62 79  te at an even by
2890: 74 65 20 62 6f 75 6e 64 61 72 79 20 69 6e 20 6f  te boundary in o
28a0: 72 64 65 72 20 74 6f 0a 2a 2a 20 74 65 72 6d 69  rder to.** termi
28b0: 6e 61 74 65 20 61 20 55 54 46 31 36 20 73 74 72  nate a UTF16 str
28c0: 69 6e 67 2c 20 65 76 65 6e 20 69 66 20 74 68 65  ing, even if the
28d0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
28e0: 20 74 68 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   the buffer.** i
28f0: 73 20 61 6e 20 6f 64 64 20 6e 75 6d 62 65 72 20  s an odd number 
2900: 6f 66 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  of bytes..*/.sta
2910: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
2920: 49 4e 45 20 69 6e 74 20 76 64 62 65 4d 65 6d 41  INE int vdbeMemA
2930: 64 64 54 65 72 6d 69 6e 61 74 6f 72 28 4d 65 6d  ddTerminator(Mem
2940: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 73   *pMem){.  if( s
2950: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
2960: 77 28 70 4d 65 6d 2c 20 70 4d 65 6d 2d 3e 6e 2b  w(pMem, pMem->n+
2970: 33 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65 74  3, 1) ){.    ret
2980: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2990: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4d 65  _BKPT;.  }.  pMe
29a0: 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d 20 3d 20  m->z[pMem->n] = 
29b0: 30 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65  0;.  pMem->z[pMe
29c0: 6d 2d 3e 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  m->n+1] = 0;.  p
29d0: 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b 32  Mem->z[pMem->n+2
29e0: 5d 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e 66  ] = 0;.  pMem->f
29f0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
2a00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2a20: 68 61 6e 67 65 20 70 4d 65 6d 20 73 6f 20 74 68  hange pMem so th
2a30: 61 74 20 69 74 73 20 4d 45 4d 5f 53 74 72 20 6f  at its MEM_Str o
2a40: 72 20 4d 45 4d 5f 42 6c 6f 62 20 76 61 6c 75 65  r MEM_Blob value
2a50: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
2a60: 20 4d 45 4d 2e 7a 4d 61 6c 6c 6f 63 2c 20 77 68   MEM.zMalloc, wh
2a70: 65 72 65 20 69 74 20 63 61 6e 20 62 65 20 73 61  ere it can be sa
2a80: 66 65 6c 79 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  fely written..**
2a90: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2aa0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
2ab0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
2ac0: 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
2ad0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2ae0: 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61  dbeMemMakeWritea
2af0: 62 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  ble(Mem *pMem){.
2b00: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
2b10: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
2b20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d  _mutex_held(pMem
2b30: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2b40: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
2b50: 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
2b60: 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 66 28  t(pMem) );.  if(
2b70: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
2b80: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
2b90: 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  b))!=0 ){.    if
2ba0: 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 4d 65  ( ExpandBlob(pMe
2bb0: 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
2bc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66  TE_NOMEM;.    if
2bd0: 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  ( pMem->szMalloc
2be0: 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 7a 21 3d  ==0 || pMem->z!=
2bf0: 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  pMem->zMalloc ){
2c00: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
2c10: 76 64 62 65 4d 65 6d 41 64 64 54 65 72 6d 69 6e  vdbeMemAddTermin
2c20: 61 74 6f 72 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ator(pMem);.    
2c30: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2c40: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2c50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d    pMem->flags &=
2c60: 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 23 69 66   ~MEM_Ephem;.#if
2c70: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2c80: 0a 20 20 70 4d 65 6d 2d 3e 70 53 63 6f 70 79 46  .  pMem->pScopyF
2c90: 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
2ca0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2cb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
2cc0: 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d 2a 20   the given Mem* 
2cd0: 68 61 73 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  has a zero-fille
2ce0: 64 20 74 61 69 6c 2c 20 74 75 72 6e 20 69 74 20  d tail, turn it 
2cf0: 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79  into an ordinary
2d00: 0a 2a 2a 20 62 6c 6f 62 20 73 74 6f 72 65 64 20  .** blob stored 
2d10: 69 6e 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  in dynamically a
2d20: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a  llocated space..
2d30: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2d40: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2d50: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
2d60: 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 4d 65 6d  emExpandBlob(Mem
2d70: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 6e   *pMem){.  int n
2d80: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
2d90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
2da0: 4d 5f 5a 65 72 6f 20 29 3b 0a 20 20 61 73 73 65  M_Zero );.  asse
2db0: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
2dc0: 26 4d 45 4d 5f 42 6c 6f 62 29 21 3d 30 20 7c 7c  &MEM_Blob)!=0 ||
2dd0: 20 4d 65 6d 4e 75 6c 6c 4e 6f 63 68 6e 67 28 70   MemNullNochng(p
2de0: 4d 65 6d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  Mem) );.  testca
2df0: 73 65 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  se( sqlite3_valu
2e00: 65 5f 6e 6f 63 68 61 6e 67 65 28 70 4d 65 6d 29  e_nochange(pMem)
2e10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
2e20: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
2e30: 6f 77 53 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20  owSet(pMem) );. 
2e40: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
2e50: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
2e60: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
2e70: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2e80: 20 20 2f 2a 20 53 65 74 20 6e 42 79 74 65 20 74    /* Set nByte t
2e90: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
2ea0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
2eb0: 6f 20 73 74 6f 72 65 20 74 68 65 20 65 78 70 61  o store the expa
2ec0: 6e 64 65 64 20 62 6c 6f 62 2e 20 2a 2f 0a 20 20  nded blob. */.  
2ed0: 6e 42 79 74 65 20 3d 20 70 4d 65 6d 2d 3e 6e 20  nByte = pMem->n 
2ee0: 2b 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  + pMem->u.nZero;
2ef0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 30 20  .  if( nByte<=0 
2f00: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4d 65 6d  ){.    if( (pMem
2f10: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
2f20: 6f 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ob)==0 ) return 
2f30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 6e  SQLITE_OK;.    n
2f40: 42 79 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Byte = 1;.  }.  
2f50: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
2f60: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79  emGrow(pMem, nBy
2f70: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65  te, 1) ){.    re
2f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f90: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 6d  M_BKPT;.  }..  m
2fa0: 65 6d 73 65 74 28 26 70 4d 65 6d 2d 3e 7a 5b 70  emset(&pMem->z[p
2fb0: 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 70 4d 65 6d  Mem->n], 0, pMem
2fc0: 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 70 4d  ->u.nZero);.  pM
2fd0: 65 6d 2d 3e 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75  em->n += pMem->u
2fe0: 2e 6e 5a 65 72 6f 3b 0a 20 20 70 4d 65 6d 2d 3e  .nZero;.  pMem->
2ff0: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 5a  flags &= ~(MEM_Z
3000: 65 72 6f 7c 4d 45 4d 5f 54 65 72 6d 29 3b 0a 20  ero|MEM_Term);. 
3010: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3020: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
3030: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
3040: 20 67 69 76 65 6e 20 4d 65 6d 20 69 73 20 5c 75   given Mem is \u
3050: 30 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 2e  0000 terminated.
3060: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
3070: 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61  dbeMemNulTermina
3080: 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  te(Mem *pMem){. 
3090: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
30a0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
30b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
30c0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
30d0: 20 74 65 73 74 63 61 73 65 28 20 28 70 4d 65 6d   testcase( (pMem
30e0: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 54  ->flags & (MEM_T
30f0: 65 72 6d 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  erm|MEM_Str))==(
3100: 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74 72  MEM_Term|MEM_Str
3110: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
3120: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
3130: 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74  (MEM_Term|MEM_St
3140: 72 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  r))==0 );.  if( 
3150: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28  (pMem->flags & (
3160: 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74 72  MEM_Term|MEM_Str
3170: 29 29 21 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))!=MEM_Str ){. 
3180: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3190: 5f 4f 4b 3b 20 20 20 2f 2a 20 4e 6f 74 68 69 6e  _OK;   /* Nothin
31a0: 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
31b0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76  se{.    return v
31c0: 64 62 65 4d 65 6d 41 64 64 54 65 72 6d 69 6e 61  dbeMemAddTermina
31d0: 74 6f 72 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 7d  tor(pMem);.  }.}
31e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 4d 45 4d 5f  ../*.** Add MEM_
31f0: 53 74 72 20 74 6f 20 74 68 65 20 73 65 74 20 6f  Str to the set o
3200: 66 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  f representation
3210: 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  s for the given 
3220: 4d 65 6d 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  Mem.  This.** ro
3230: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
3240: 6c 6c 65 64 20 69 66 20 70 4d 65 6d 20 69 73 20  lled if pMem is 
3250: 61 20 6e 75 6d 62 65 72 20 6f 66 20 73 6f 6d 65  a number of some
3260: 20 6b 69 6e 64 2c 20 6e 6f 74 20 61 20 4e 55 4c   kind, not a NUL
3270: 4c 0a 2a 2a 20 6f 72 20 61 20 42 4c 4f 42 2e 0a  L.** or a BLOB..
3280: 2a 2a 0a 2a 2a 20 45 78 69 73 74 69 6e 67 20 72  **.** Existing r
3290: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 4d  epresentations M
32a0: 45 4d 5f 49 6e 74 2c 20 4d 45 4d 5f 52 65 61 6c  EM_Int, MEM_Real
32b0: 2c 20 6f 72 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  , or MEM_IntReal
32c0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
32d0: 0a 2a 2a 20 69 66 20 62 46 6f 72 63 65 20 69 73  .** if bForce is
32e0: 20 74 72 75 65 20 62 75 74 20 61 72 65 20 72 65   true but are re
32f0: 74 61 69 6e 65 64 20 69 66 20 62 46 6f 72 63 65  tained if bForce
3300: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
3310: 20 41 20 4d 45 4d 5f 4e 75 6c 6c 20 76 61 6c 75   A MEM_Null valu
3320: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
3330: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
3340: 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  unction. This fu
3350: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 73 65  nction is.** use
3360: 64 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67  d for converting
3370: 20 76 61 6c 75 65 73 20 74 6f 20 74 65 78 74 20   values to text 
3380: 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  for returning to
3390: 20 74 68 65 20 75 73 65 72 20 28 69 2e 65 2e 20   the user (i.e. 
33a0: 76 69 61 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  via.** sqlite3_v
33b0: 61 6c 75 65 5f 74 65 78 74 28 29 29 2c 20 6f 72  alue_text()), or
33c0: 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
33d0: 61 74 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  at values to be 
33e0: 75 73 65 64 20 61 73 20 62 74 72 65 65 0a 2a 2a  used as btree.**
33f0: 20 6b 65 79 73 20 61 72 65 20 73 74 72 69 6e 67   keys are string
3400: 73 2e 20 49 6e 20 74 68 65 20 66 6f 72 6d 65 72  s. In the former
3410: 20 63 61 73 65 20 61 20 4e 55 4c 4c 20 70 6f 69   case a NULL poi
3420: 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  nter is returned
3430: 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 61 6e 64   the.** user and
3440: 20 74 68 65 20 6c 61 74 74 65 72 20 69 73 20 61   the latter is a
3450: 6e 20 69 6e 74 65 72 6e 61 6c 20 70 72 6f 67 72  n internal progr
3460: 61 6d 6d 69 6e 67 20 65 72 72 6f 72 2e 0a 2a 2f  amming error..*/
3470: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3480: 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 4d 65 6d  MemStringify(Mem
3490: 20 2a 70 4d 65 6d 2c 20 75 38 20 65 6e 63 2c 20   *pMem, u8 enc, 
34a0: 75 38 20 62 46 6f 72 63 65 29 7b 0a 20 20 63 6f  u8 bForce){.  co
34b0: 6e 73 74 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  nst int nByte = 
34c0: 33 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  32;..  assert( p
34d0: 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Mem->db==0 || sq
34e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
34f0: 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pMem->db->mutex
3500: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
3510: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pMem->flags&MEM
3520: 5f 5a 65 72 6f 29 20 29 3b 0a 20 20 61 73 73 65  _Zero) );.  asse
3530: 72 74 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67  rt( !(pMem->flag
3540: 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
3550: 6c 6f 62 29 29 20 29 3b 0a 20 20 61 73 73 65 72  lob)) );.  asser
3560: 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 28  t( pMem->flags&(
3570: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
3580: 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 3b  |MEM_IntReal) );
3590: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
35a0: 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
35b0: 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 61 73  et(pMem) );.  as
35c0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
35d0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
35e0: 20 29 3b 0a 0a 0a 20 20 69 66 28 20 73 71 6c 69   );...  if( sqli
35f0: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
3600: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 6e  ndResize(pMem, n
3610: 42 79 74 65 29 20 29 7b 0a 20 20 20 20 70 4d 65  Byte) ){.    pMe
3620: 6d 2d 3e 65 6e 63 20 3d 20 30 3b 0a 20 20 20 20  m->enc = 0;.    
3630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
3640: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
3650: 20 76 64 62 65 4d 65 6d 52 65 6e 64 65 72 4e 75   vdbeMemRenderNu
3660: 6d 28 6e 42 79 74 65 2c 20 70 4d 65 6d 2d 3e 7a  m(nByte, pMem->z
3670: 2c 20 70 4d 65 6d 29 3b 0a 20 20 61 73 73 65 72  , pMem);.  asser
3680: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
3690: 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c  .  pMem->n = sql
36a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 4e 4e 28 70  ite3Strlen30NN(p
36b0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 70 4d 65 6d 2d  Mem->z);.  pMem-
36c0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
36d0: 46 38 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  F8;.  pMem->flag
36e0: 73 20 7c 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s |= MEM_Str|MEM
36f0: 5f 54 65 72 6d 3b 0a 20 20 69 66 28 20 62 46 6f  _Term;.  if( bFo
3700: 72 63 65 20 29 20 70 4d 65 6d 2d 3e 66 6c 61 67  rce ) pMem->flag
3710: 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d  s &= ~(MEM_Int|M
3720: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52  EM_Real|MEM_IntR
3730: 65 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  eal);.  sqlite3V
3740: 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e  dbeChangeEncodin
3750: 67 28 70 4d 65 6d 2c 20 65 6e 63 29 3b 0a 20 20  g(pMem, enc);.  
3760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
3780: 79 20 63 65 6c 6c 20 70 4d 65 6d 20 63 6f 6e 74  y cell pMem cont
3790: 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 78 74  ains the context
37a0: 20 6f 66 20 61 6e 20 61 67 67 72 65 67 61 74 65   of an aggregate
37b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68   function..** Th
37c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  is routine calls
37d0: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 6d 65   the finalize me
37e0: 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 66 75  thod for that fu
37f0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 0a 2a 2a 20  nction.  The.** 
3800: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61 67  result of the ag
3810: 67 72 65 67 61 74 65 20 69 73 20 73 74 6f 72 65  gregate is store
3820: 64 20 62 61 63 6b 20 69 6e 74 6f 20 70 4d 65 6d  d back into pMem
3830: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
3840: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
3850: 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 72 65 70  he finalizer rep
3860: 6f 72 74 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  orts an error.  
3870: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 74 68  SQLITE_OK.** oth
3880: 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
3890: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e  qlite3VdbeMemFin
38a0: 61 6c 69 7a 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  alize(Mem *pMem,
38b0: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 29   FuncDef *pFunc)
38c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  {.  sqlite3_cont
38d0: 65 78 74 20 63 74 78 3b 0a 20 20 4d 65 6d 20 74  ext ctx;.  Mem t
38e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
38f0: 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
3900: 28 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69  ( pFunc->xFinali
3910: 7a 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze!=0 );.  asser
3920: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
3930: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 7c  & MEM_Null)!=0 |
3940: 7c 20 70 46 75 6e 63 3d 3d 70 4d 65 6d 2d 3e 75  | pFunc==pMem->u
3950: 2e 70 44 65 66 20 29 3b 0a 20 20 61 73 73 65 72  .pDef );.  asser
3960: 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c  t( pMem->db==0 |
3970: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
3980: 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  held(pMem->db->m
3990: 75 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65  utex) );.  memse
39a0: 74 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f  t(&ctx, 0, sizeo
39b0: 66 28 63 74 78 29 29 3b 0a 20 20 6d 65 6d 73 65  f(ctx));.  memse
39c0: 74 28 26 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&t, 0, sizeof(
39d0: 74 29 29 3b 0a 20 20 74 2e 66 6c 61 67 73 20 3d  t));.  t.flags =
39e0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 74 2e 64   MEM_Null;.  t.d
39f0: 62 20 3d 20 70 4d 65 6d 2d 3e 64 62 3b 0a 20 20  b = pMem->db;.  
3a00: 63 74 78 2e 70 4f 75 74 20 3d 20 26 74 3b 0a 20  ctx.pOut = &t;. 
3a10: 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d 65 6d   ctx.pMem = pMem
3a20: 3b 0a 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20  ;.  ctx.pFunc = 
3a30: 70 46 75 6e 63 3b 0a 20 20 70 46 75 6e 63 2d 3e  pFunc;.  pFunc->
3a40: 78 46 69 6e 61 6c 69 7a 65 28 26 63 74 78 29 3b  xFinalize(&ctx);
3a50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35   /* IMP: R-24505
3a60: 2d 32 33 32 33 30 20 2a 2f 0a 20 20 61 73 73 65  -23230 */.  asse
3a70: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
3a80: 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29   & MEM_Dyn)==0 )
3a90: 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 73 7a  ;.  if( pMem->sz
3aa0: 4d 61 6c 6c 6f 63 3e 30 20 29 20 73 71 6c 69 74  Malloc>0 ) sqlit
3ab0: 65 33 44 62 46 72 65 65 4e 4e 28 70 4d 65 6d 2d  e3DbFreeNN(pMem-
3ac0: 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  >db, pMem->zMall
3ad0: 6f 63 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4d  oc);.  memcpy(pM
3ae0: 65 6d 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  em, &t, sizeof(t
3af0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 74 78  ));.  return ctx
3b00: 2e 69 73 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  .isError;.}../*.
3b10: 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  ** Memory cell p
3b20: 41 63 63 75 6d 20 63 6f 6e 74 61 69 6e 73 20 74  Accum contains t
3b30: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 6e  he context of an
3b40: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
3b50: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
3b60: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 78  tine calls the x
3b70: 56 61 6c 75 65 20 6d 65 74 68 6f 64 20 66 6f 72  Value method for
3b80: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 61   that function a
3b90: 6e 64 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65  nd stores.** the
3ba0: 20 72 65 73 75 6c 74 73 20 69 6e 20 6d 65 6d 6f   results in memo
3bb0: 72 79 20 63 65 6c 6c 20 70 4d 65 6d 2e 0a 2a 2a  ry cell pMem..**
3bc0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
3bd0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
3be0: 78 56 61 6c 75 65 28 29 20 72 65 70 6f 72 74 73  xValue() reports
3bf0: 20 61 6e 20 65 72 72 6f 72 2e 20 53 51 4c 49 54   an error. SQLIT
3c00: 45 5f 4f 4b 20 0a 2a 2a 20 6f 74 68 65 72 77 69  E_OK .** otherwi
3c10: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
3c20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
3c30: 57 46 55 4e 43 0a 69 6e 74 20 73 71 6c 69 74 65  WFUNC.int sqlite
3c40: 33 56 64 62 65 4d 65 6d 41 67 67 56 61 6c 75 65  3VdbeMemAggValue
3c50: 28 4d 65 6d 20 2a 70 41 63 63 75 6d 2c 20 4d 65  (Mem *pAccum, Me
3c60: 6d 20 2a 70 4f 75 74 2c 20 46 75 6e 63 44 65 66  m *pOut, FuncDef
3c70: 20 2a 70 46 75 6e 63 29 7b 0a 20 20 73 71 6c 69   *pFunc){.  sqli
3c80: 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b  te3_context ctx;
3c90: 0a 20 20 4d 65 6d 20 74 3b 0a 20 20 61 73 73 65  .  Mem t;.  asse
3ca0: 72 74 28 20 70 46 75 6e 63 21 3d 30 20 29 3b 0a  rt( pFunc!=0 );.
3cb0: 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d    assert( pFunc-
3cc0: 3e 78 56 61 6c 75 65 21 3d 30 20 29 3b 0a 20 20  >xValue!=0 );.  
3cd0: 61 73 73 65 72 74 28 20 28 70 41 63 63 75 6d 2d  assert( (pAccum-
3ce0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
3cf0: 6c 29 21 3d 30 20 7c 7c 20 70 46 75 6e 63 3d 3d  l)!=0 || pFunc==
3d00: 70 41 63 63 75 6d 2d 3e 75 2e 70 44 65 66 20 29  pAccum->u.pDef )
3d10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 63 63  ;.  assert( pAcc
3d20: 75 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  um->db==0 || sql
3d30: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3d40: 70 41 63 63 75 6d 2d 3e 64 62 2d 3e 6d 75 74 65  pAccum->db->mute
3d50: 78 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  x) );.  memset(&
3d60: 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  ctx, 0, sizeof(c
3d70: 74 78 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  tx));.  memset(&
3d80: 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 29 29  t, 0, sizeof(t))
3d90: 3b 0a 20 20 74 2e 66 6c 61 67 73 20 3d 20 4d 45  ;.  t.flags = ME
3da0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 74 2e 64 62 20 3d  M_Null;.  t.db =
3db0: 20 70 41 63 63 75 6d 2d 3e 64 62 3b 0a 20 20 73   pAccum->db;.  s
3dc0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
3dd0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 63 74  Null(pOut);.  ct
3de0: 78 2e 70 4f 75 74 20 3d 20 70 4f 75 74 3b 0a 20  x.pOut = pOut;. 
3df0: 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 41 63 63   ctx.pMem = pAcc
3e00: 75 6d 3b 0a 20 20 63 74 78 2e 70 46 75 6e 63 20  um;.  ctx.pFunc 
3e10: 3d 20 70 46 75 6e 63 3b 0a 20 20 70 46 75 6e 63  = pFunc;.  pFunc
3e20: 2d 3e 78 56 61 6c 75 65 28 26 63 74 78 29 3b 0a  ->xValue(&ctx);.
3e30: 20 20 72 65 74 75 72 6e 20 63 74 78 2e 69 73 45    return ctx.isE
3e40: 72 72 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rror;.}.#endif /
3e50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
3e60: 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a  NDOWFUNC */../*.
3e70: 2a 2a 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** If the memory
3e80: 20 63 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 61   cell contains a
3e90: 20 76 61 6c 75 65 20 74 68 61 74 20 6d 75 73 74   value that must
3ea0: 20 62 65 20 66 72 65 65 64 20 62 79 0a 2a 2a 20   be freed by.** 
3eb0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 65 78 74  invoking the ext
3ec0: 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 20 69  ernal callback i
3ed0: 6e 20 4d 65 6d 2e 78 44 65 6c 2c 20 74 68 65 6e  n Mem.xDel, then
3ee0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3ef0: 20 77 69 6c 6c 20 66 72 65 65 20 74 68 61 74 20   will free that 
3f00: 76 61 6c 75 65 2e 20 20 49 74 20 61 6c 73 6f 20  value.  It also 
3f10: 73 65 74 73 20 4d 65 6d 2e 66 6c 61 67 73 20 74  sets Mem.flags t
3f20: 6f 20 4d 45 4d 5f 4e 75 6c 6c 2e 0a 2a 2a 0a 2a  o MEM_Null..**.*
3f30: 2a 20 54 68 69 73 20 69 73 20 61 20 68 65 6c 70  * This is a help
3f40: 65 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  er routine for s
3f50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
3f60: 4e 75 6c 6c 28 29 20 61 6e 64 0a 2a 2a 20 66 6f  Null() and.** fo
3f70: 72 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  r sqlite3VdbeMem
3f80: 52 65 6c 65 61 73 65 28 29 2e 20 20 55 73 65 20  Release().  Use 
3f90: 74 68 6f 73 65 20 6f 74 68 65 72 20 72 6f 75 74  those other rout
3fa0: 69 6e 65 73 20 61 73 20 74 68 65 0a 2a 2a 20 65  ines as the.** e
3fb0: 6e 74 72 79 20 70 6f 69 6e 74 20 66 6f 72 20 72  ntry point for r
3fc0: 65 6c 65 61 73 69 6e 67 20 4d 65 6d 20 72 65 73  eleasing Mem res
3fd0: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ources..*/.stati
3fe0: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
3ff0: 45 20 76 6f 69 64 20 76 64 62 65 4d 65 6d 43 6c  E void vdbeMemCl
4000: 65 61 72 45 78 74 65 72 6e 41 6e 64 53 65 74 4e  earExternAndSetN
4010: 75 6c 6c 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61  ull(Mem *p){.  a
4020: 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
4030: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
4040: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
4050: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
4060: 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28   VdbeMemDynamic(
4070: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66  p) );.  if( p->f
4080: 6c 61 67 73 26 4d 45 4d 5f 41 67 67 20 29 7b 0a  lags&MEM_Agg ){.
4090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
40a0: 65 6d 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70 2d  emFinalize(p, p-
40b0: 3e 75 2e 70 44 65 66 29 3b 0a 20 20 20 20 61 73  >u.pDef);.    as
40c0: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 20  sert( (p->flags 
40d0: 26 20 4d 45 4d 5f 41 67 67 29 3d 3d 30 20 29 3b  & MEM_Agg)==0 );
40e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
40f0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
4100: 6e 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n );.  }.  if( p
4110: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20  ->flags&MEM_Dyn 
4120: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4130: 2d 3e 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  ->xDel!=SQLITE_D
4140: 59 4e 41 4d 49 43 20 26 26 20 70 2d 3e 78 44 65  YNAMIC && p->xDe
4150: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 78  l!=0 );.    p->x
4160: 44 65 6c 28 28 76 6f 69 64 20 2a 29 70 2d 3e 7a  Del((void *)p->z
4170: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67  );.  }.  p->flag
4180: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 7d 0a  s = MEM_Null;.}.
4190: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
41a0: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
41b0: 65 20 4d 65 6d 20 70 2c 20 62 6f 74 68 20 65 78  e Mem p, both ex
41c0: 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 63 6c  ternal memory cl
41d0: 65 61 72 65 64 0a 2a 2a 20 62 79 20 70 2d 3e 78  eared.** by p->x
41e0: 44 65 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 20 69  Del and memory i
41f0: 6e 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2a  n p->zMalloc..**
4200: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
4210: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 6e 76  lper routine inv
4220: 6f 6b 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  oked by sqlite3V
4230: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  dbeMemRelease() 
4240: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 75 73 75 61  in.** the unusua
4250: 6c 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  l case where the
4260: 72 65 20 72 65 61 6c 6c 79 20 69 73 20 6d 65 6d  re really is mem
4270: 6f 72 79 20 69 6e 20 70 20 74 68 61 74 20 6e 65  ory in p that ne
4280: 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 66 72 65  eds.** to be fre
4290: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ed..*/.static SQ
42a0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
42b0: 69 64 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 28  id vdbeMemClear(
42c0: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 56  Mem *p){.  if( V
42d0: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 29  dbeMemDynamic(p)
42e0: 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65 6d 43   ){.    vdbeMemC
42f0: 6c 65 61 72 45 78 74 65 72 6e 41 6e 64 53 65 74  learExternAndSet
4300: 4e 75 6c 6c 28 70 29 3b 0a 20 20 7d 0a 20 20 69  Null(p);.  }.  i
4310: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
4320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4330: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 2d 3e  reeNN(p->db, p->
4340: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 70 2d  zMalloc);.    p-
4350: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
4360: 20 7d 0a 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a 7d   }.  p->z = 0;.}
4370: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4380: 61 6e 79 20 6d 65 6d 6f 72 79 20 72 65 73 6f 75  any memory resou
4390: 72 63 65 73 20 68 65 6c 64 20 62 79 20 74 68 65  rces held by the
43a0: 20 4d 65 6d 2e 20 20 42 6f 74 68 20 74 68 65 20   Mem.  Both the 
43b0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 69 73 0a 2a  memory that is.*
43c0: 2a 20 66 72 65 65 20 62 79 20 4d 65 6d 2e 78 44  * free by Mem.xD
43d0: 65 6c 20 61 6e 64 20 74 68 65 20 4d 65 6d 2e 7a  el and the Mem.z
43e0: 4d 61 6c 6c 6f 63 20 61 6c 6c 6f 63 61 74 69 6f  Malloc allocatio
43f0: 6e 20 61 72 65 20 66 72 65 65 64 2e 0a 2a 2a 0a  n are freed..**.
4400: 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
4410: 69 6e 65 20 70 72 69 6f 72 20 74 6f 20 63 6c 65  ine prior to cle
4420: 61 6e 20 75 70 20 70 72 69 6f 72 20 74 6f 20 61  an up prior to a
4430: 62 61 6e 64 6f 6e 69 6e 67 20 61 20 4d 65 6d 2c  bandoning a Mem,
4440: 20 6f 72 20 74 6f 0a 2a 2a 20 72 65 73 65 74 20   or to.** reset 
4450: 61 20 4d 65 6d 20 62 61 63 6b 20 74 6f 20 69 74  a Mem back to it
4460: 73 20 6d 69 6e 69 6d 75 6d 20 6d 65 6d 6f 72 79  s minimum memory
4470: 20 75 74 69 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a   utilization..**
4480: 0a 2a 2a 20 55 73 65 20 73 71 6c 69 74 65 33 56  .** Use sqlite3V
4490: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 29 20  dbeMemSetNull() 
44a0: 74 6f 20 72 65 6c 65 61 73 65 20 6a 75 73 74 20  to release just 
44b0: 74 68 65 20 4d 65 6d 2e 78 44 65 6c 20 73 70 61  the Mem.xDel spa
44c0: 63 65 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 69  ce.** prior to i
44d0: 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 63 6f 6e  nserting new con
44e0: 74 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 4d 65  tent into the Me
44f0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
4500: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
4510: 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61 73 73 65  (Mem *p){.  asse
4520: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
4530: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
4540: 73 28 70 29 20 29 3b 0a 20 20 69 66 28 20 56 64  s(p) );.  if( Vd
4550: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 29 20  beMemDynamic(p) 
4560: 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  || p->szMalloc )
4570: 7b 0a 20 20 20 20 76 64 62 65 4d 65 6d 43 6c 65  {.    vdbeMemCle
4580: 61 72 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ar(p);.  }.}../*
4590: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 36 34  .** Convert a 64
45a0: 2d 62 69 74 20 49 45 45 45 20 64 6f 75 62 6c 65  -bit IEEE double
45b0: 20 69 6e 74 6f 20 61 20 36 34 2d 62 69 74 20 73   into a 64-bit s
45c0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
45d0: 2a 20 49 66 20 74 68 65 20 64 6f 75 62 6c 65 20  * If the double 
45e0: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
45f0: 6f 66 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  of a 64-bit sign
4600: 65 64 20 69 6e 74 65 67 65 72 20 74 68 65 6e 0a  ed integer then.
4610: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 6c  ** return the cl
4620: 6f 73 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  osest available 
4630: 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
4640: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
4650: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
4660: 20 69 36 34 20 64 6f 75 62 6c 65 54 6f 49 6e 74   i64 doubleToInt
4670: 36 34 28 64 6f 75 62 6c 65 20 72 29 7b 0a 23 69  64(double r){.#i
4680: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4690: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
46a0: 20 20 2f 2a 20 57 68 65 6e 20 66 6c 6f 61 74 69    /* When floati
46b0: 6e 67 2d 70 6f 69 6e 74 20 69 73 20 6f 6d 69 74  ng-point is omit
46c0: 74 65 64 2c 20 64 6f 75 62 6c 65 20 61 6e 64 20  ted, double and 
46d0: 69 6e 74 36 34 20 61 72 65 20 74 68 65 20 73 61  int64 are the sa
46e0: 6d 65 20 74 68 69 6e 67 20 2a 2f 0a 20 20 72 65  me thing */.  re
46f0: 74 75 72 6e 20 72 3b 0a 23 65 6c 73 65 0a 20 20  turn r;.#else.  
4700: 2f 2a 0a 20 20 2a 2a 20 4d 61 6e 79 20 63 6f 6d  /*.  ** Many com
4710: 70 69 6c 65 72 73 20 77 65 20 65 6e 63 6f 75 6e  pilers we encoun
4720: 74 65 72 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e  ter do not defin
4730: 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20  e constants for 
4740: 74 68 65 0a 20 20 2a 2a 20 6d 69 6e 69 6d 75 6d  the.  ** minimum
4750: 20 61 6e 64 20 6d 61 78 69 6d 75 6d 20 36 34 2d   and maximum 64-
4760: 62 69 74 20 69 6e 74 65 67 65 72 73 2c 20 6f 72  bit integers, or
4770: 20 74 68 65 79 20 64 65 66 69 6e 65 20 74 68 65   they define the
4780: 6d 0a 20 20 2a 2a 20 69 6e 63 6f 6e 73 69 73 74  m.  ** inconsist
4790: 65 6e 74 6c 79 2e 20 20 41 6e 64 20 6d 61 6e 79  ently.  And many
47a0: 20 64 6f 20 6e 6f 74 20 75 6e 64 65 72 73 74 61   do not understa
47b0: 6e 64 20 74 68 65 20 22 4c 4c 22 20 6e 6f 74 61  nd the "LL" nota
47c0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 77 65  tion..  ** So we
47d0: 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 20   define our own 
47e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 61 6e 74 73  static constants
47f0: 20 68 65 72 65 20 75 73 69 6e 67 20 6e 6f 74 68   here using noth
4800: 69 6e 67 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20  ing.  ** larger 
4810: 74 68 61 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  than a 32-bit in
4820: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 0a  teger constant..
4830: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f    */.  static co
4840: 6e 73 74 20 69 36 34 20 6d 61 78 49 6e 74 20 3d  nst i64 maxInt =
4850: 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
4860: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
4870: 36 34 20 6d 69 6e 49 6e 74 20 3d 20 53 4d 41 4c  64 minInt = SMAL
4880: 4c 45 53 54 5f 49 4e 54 36 34 3b 0a 0a 20 20 69  LEST_INT64;..  i
4890: 66 28 20 72 3c 3d 28 64 6f 75 62 6c 65 29 6d 69  f( r<=(double)mi
48a0: 6e 49 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nInt ){.    retu
48b0: 72 6e 20 6d 69 6e 49 6e 74 3b 0a 20 20 7d 65 6c  rn minInt;.  }el
48c0: 73 65 20 69 66 28 20 72 3e 3d 28 64 6f 75 62 6c  se if( r>=(doubl
48d0: 65 29 6d 61 78 49 6e 74 20 29 7b 0a 20 20 20 20  e)maxInt ){.    
48e0: 72 65 74 75 72 6e 20 6d 61 78 49 6e 74 3b 0a 20  return maxInt;. 
48f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
4900: 72 6e 20 28 69 36 34 29 72 3b 0a 20 20 7d 0a 23  rn (i64)r;.  }.#
4910: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
4920: 65 74 75 72 6e 20 73 6f 6d 65 20 6b 69 6e 64 20  eturn some kind 
4930: 6f 66 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  of integer value
4940: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 62 65   which is the be
4950: 73 74 20 77 65 20 63 61 6e 20 64 6f 0a 2a 2a 20  st we can do.** 
4960: 61 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  at representing 
4970: 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 2a  the value that *
4980: 70 4d 65 6d 20 64 65 73 63 72 69 62 65 73 20 61  pMem describes a
4990: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  s an integer..**
49a0: 20 49 66 20 70 4d 65 6d 20 69 73 20 61 6e 20 69   If pMem is an i
49b0: 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
49c0: 20 76 61 6c 75 65 20 69 73 20 65 78 61 63 74 2e   value is exact.
49d0: 20 20 49 66 20 70 4d 65 6d 20 69 73 0a 2a 2a 20    If pMem is.** 
49e0: 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  a floating-point
49f0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
4a00: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
4a10: 69 6e 74 65 67 65 72 20 70 61 72 74 2e 0a 2a 2a  integer part..**
4a20: 20 49 66 20 70 4d 65 6d 20 69 73 20 61 20 73 74   If pMem is a st
4a30: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68  ring or blob, th
4a40: 65 6e 20 77 65 20 6d 61 6b 65 20 61 6e 20 61 74  en we make an at
4a50: 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74  tempt to convert
4a60: 0a 2a 2a 20 69 74 20 69 6e 74 6f 20 61 6e 20 69  .** it into an i
4a70: 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75 72  nteger and retur
4a80: 6e 20 74 68 61 74 2e 20 20 49 66 20 70 4d 65 6d  n that.  If pMem
4a90: 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 0a 2a   represents an.*
4aa0: 2a 20 61 6e 20 53 51 4c 2d 4e 55 4c 4c 20 76 61  * an SQL-NULL va
4ab0: 6c 75 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  lue, return 0..*
4ac0: 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 72 65 70  *.** If pMem rep
4ad0: 72 65 73 65 6e 74 73 20 61 20 73 74 72 69 6e 67  resents a string
4ae0: 20 76 61 6c 75 65 2c 20 69 74 73 20 65 6e 63 6f   value, its enco
4af0: 64 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 68  ding might be ch
4b00: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
4b10: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
4b20: 20 69 36 34 20 6d 65 6d 49 6e 74 56 61 6c 75 65   i64 memIntValue
4b30: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
4b40: 36 34 20 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20  64 value = 0;.  
4b50: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70 4d  sqlite3Atoi64(pM
4b60: 65 6d 2d 3e 7a 2c 20 26 76 61 6c 75 65 2c 20 70  em->z, &value, p
4b70: 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e  Mem->n, pMem->en
4b80: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 76 61 6c  c);.  return val
4b90: 75 65 3b 0a 7d 0a 69 36 34 20 73 71 6c 69 74 65  ue;.}.i64 sqlite
4ba0: 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 4d 65  3VdbeIntValue(Me
4bb0: 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20  m *pMem){.  int 
4bc0: 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72 74 28  flags;.  assert(
4bd0: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
4be0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4bf0: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
4c00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
4c10: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
4c20: 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
4c30: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
4c40: 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c 61 67  lags;.  if( flag
4c50: 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
4c60: 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20  _IntReal) ){.   
4c70: 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
4c80: 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
4c90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65  ;.    return pMe
4ca0: 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 20  m->u.i;.  }else 
4cb0: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
4cc0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
4cd0: 72 6e 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34  rn doubleToInt64
4ce0: 28 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 7d  (pMem->u.r);.  }
4cf0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
4d00: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
4d10: 6f 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ob) ){.    asser
4d20: 74 28 20 70 4d 65 6d 2d 3e 7a 20 7c 7c 20 70 4d  t( pMem->z || pM
4d30: 65 6d 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  em->n==0 );.    
4d40: 72 65 74 75 72 6e 20 6d 65 6d 49 6e 74 56 61 6c  return memIntVal
4d50: 75 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  ue(pMem);.  }els
4d60: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
4d70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4d80: 74 75 72 6e 20 74 68 65 20 62 65 73 74 20 72 65  turn the best re
4d90: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
4da0: 70 4d 65 6d 20 74 68 61 74 20 77 65 20 63 61 6e  pMem that we can
4db0: 20 67 65 74 20 69 6e 74 6f 20 61 0a 2a 2a 20 64   get into a.** d
4dc0: 6f 75 62 6c 65 2e 20 20 49 66 20 70 4d 65 6d 20  ouble.  If pMem 
4dd0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 64 6f 75  is already a dou
4de0: 62 6c 65 20 6f 72 20 61 6e 20 69 6e 74 65 67 65  ble or an intege
4df0: 72 2c 20 72 65 74 75 72 6e 20 69 74 73 0a 2a 2a  r, return its.**
4e00: 20 76 61 6c 75 65 2e 20 20 49 66 20 69 74 20 69   value.  If it i
4e10: 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c  s a string or bl
4e20: 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65  ob, try to conve
4e30: 72 74 20 69 74 20 74 6f 20 61 20 64 6f 75 62 6c  rt it to a doubl
4e40: 65 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 61  e..** If it is a
4e50: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
4e60: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  0..*/.static SQL
4e70: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 6f 75  ITE_NOINLINE dou
4e80: 62 6c 65 20 6d 65 6d 52 65 61 6c 56 61 6c 75 65  ble memRealValue
4e90: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 2f  (Mem *pMem){.  /
4ea0: 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
4eb0: 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
4ec0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
4ed0: 54 2e 2e 2e 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  T... */.  double
4ee0: 20 76 61 6c 20 3d 20 28 64 6f 75 62 6c 65 29 30   val = (double)0
4ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28  ;.  sqlite3AtoF(
4f00: 70 4d 65 6d 2d 3e 7a 2c 20 26 76 61 6c 2c 20 70  pMem->z, &val, p
4f10: 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e  Mem->n, pMem->en
4f20: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 76 61 6c  c);.  return val
4f30: 3b 0a 7d 0a 64 6f 75 62 6c 65 20 73 71 6c 69 74  ;.}.double sqlit
4f40: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
4f50: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73  Mem *pMem){.  as
4f60: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d  sert( pMem->db==
4f70: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
4f80: 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62  ex_held(pMem->db
4f90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4fa0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
4fb0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
4fc0: 20 29 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e   );.  if( pMem->
4fd0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
4fe0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
4ff0: 4d 65 6d 2d 3e 75 2e 72 3b 0a 20 20 7d 65 6c 73  Mem->u.r;.  }els
5000: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
5010: 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
5020: 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20  _IntReal) ){.   
5030: 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
5040: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
5050: 52 65 61 6c 20 29 3b 0a 20 20 20 20 72 65 74 75  Real );.    retu
5060: 72 6e 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 2d  rn (double)pMem-
5070: 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66  >u.i;.  }else if
5080: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
5090: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
50a0: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
50b0: 20 6d 65 6d 52 65 61 6c 56 61 6c 75 65 28 70 4d   memRealValue(pM
50c0: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
50d0: 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49    /* (double)0 I
50e0: 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45  n case of SQLITE
50f0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
5100: 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72  OINT... */.    r
5110: 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29 30 3b  eturn (double)0;
5120: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
5130: 74 75 72 6e 20 31 20 69 66 20 70 4d 65 6d 20 72  turn 1 if pMem r
5140: 65 70 72 65 73 65 6e 74 73 20 74 72 75 65 2c 20  epresents true, 
5150: 61 6e 64 20 72 65 74 75 72 6e 20 30 20 69 66 20  and return 0 if 
5160: 70 4d 65 6d 20 72 65 70 72 65 73 65 6e 74 73 20  pMem represents 
5170: 66 61 6c 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  false..** Return
5180: 20 74 68 65 20 76 61 6c 75 65 20 69 66 4e 75 6c   the value ifNul
5190: 6c 20 69 66 20 70 4d 65 6d 20 69 73 20 4e 55 4c  l if pMem is NUL
51a0: 4c 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  L.  .*/.int sqli
51b0: 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61  te3VdbeBooleanVa
51c0: 6c 75 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  lue(Mem *pMem, i
51d0: 6e 74 20 69 66 4e 75 6c 6c 29 7b 0a 20 20 74 65  nt ifNull){.  te
51e0: 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 66 6c  stcase( pMem->fl
51f0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61  ags & MEM_IntRea
5200: 6c 20 29 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d  l );.  if( pMem-
5210: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
5220: 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29  t|MEM_IntReal) )
5230: 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 75 2e   return pMem->u.
5240: 69 21 3d 30 3b 0a 20 20 69 66 28 20 70 4d 65 6d  i!=0;.  if( pMem
5250: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
5260: 6c 6c 20 29 20 72 65 74 75 72 6e 20 69 66 4e 75  ll ) return ifNu
5270: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ll;.  return sql
5280: 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
5290: 65 28 70 4d 65 6d 29 21 3d 30 2e 30 3b 0a 7d 0a  e(pMem)!=0.0;.}.
52a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 45 4d 20 73  ./*.** The MEM s
52b0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 72 65  tructure is alre
52c0: 61 64 79 20 61 20 4d 45 4d 5f 52 65 61 6c 2e 20  ady a MEM_Real. 
52d0: 20 54 72 79 20 74 6f 20 61 6c 73 6f 20 6d 61 6b   Try to also mak
52e0: 65 20 69 74 20 61 0a 2a 2a 20 4d 45 4d 5f 49 6e  e it a.** MEM_In
52f0: 74 20 69 66 20 77 65 20 63 61 6e 2e 0a 2a 2f 0a  t if we can..*/.
5300: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5310: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
5320: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 36  Mem *pMem){.  i6
5330: 34 20 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20  4 ix;.  assert( 
5340: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
5350: 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 61 73 73 65  M_Real );.  asse
5360: 72 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65  rt( !sqlite3Vdbe
5370: 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d  MemIsRowSet(pMem
5380: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5390: 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Mem->db==0 || sq
53a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
53b0: 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pMem->db->mutex
53c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
53d0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
53e0: 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20  ENT(pMem) );..  
53f0: 69 78 20 3d 20 64 6f 75 62 6c 65 54 6f 49 6e 74  ix = doubleToInt
5400: 36 34 28 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 0a  64(pMem->u.r);..
5410: 20 20 2f 2a 20 4f 6e 6c 79 20 6d 61 72 6b 20 74    /* Only mark t
5420: 68 65 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  he value as an i
5430: 6e 74 65 67 65 72 20 69 66 0a 20 20 2a 2a 0a 20  nteger if.  **. 
5440: 20 2a 2a 20 20 20 20 28 31 29 20 74 68 65 20 72   **    (1) the r
5450: 6f 75 6e 64 2d 74 72 69 70 20 63 6f 6e 76 65 72  ound-trip conver
5460: 73 69 6f 6e 20 72 65 61 6c 2d 3e 69 6e 74 2d 3e  sion real->int->
5470: 72 65 61 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  real is a no-op,
5480: 20 61 6e 64 0a 20 20 2a 2a 20 20 20 20 28 32 29   and.  **    (2)
5490: 20 54 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   The integer is 
54a0: 6e 65 69 74 68 65 72 20 74 68 65 20 6c 61 72 67  neither the larg
54b0: 65 73 74 20 6e 6f 72 20 74 68 65 20 73 6d 61 6c  est nor the smal
54c0: 6c 65 73 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  lest.  **       
54d0: 20 70 6f 73 73 69 62 6c 65 20 69 6e 74 65 67 65   possible intege
54e0: 72 20 28 74 69 63 6b 65 74 20 23 33 39 32 32 29  r (ticket #3922)
54f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
5500: 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
5510: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 66 6f 6c  terms in the fol
5520: 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e  lowing condition
5530: 61 6c 20 65 6e 66 6f 72 63 65 73 0a 20 20 2a 2a  al enforces.  **
5540: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 64   the second cond
5550: 69 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65 20  ition under the 
5560: 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20  assumption that 
5570: 61 64 64 69 74 69 6f 6e 20 6f 76 65 72 66 6c 6f  addition overflo
5580: 77 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 76 61  w causes.  ** va
5590: 6c 75 65 73 20 74 6f 20 77 72 61 70 20 61 72 6f  lues to wrap aro
55a0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
55b0: 70 4d 65 6d 2d 3e 75 2e 72 3d 3d 69 78 20 26 26  pMem->u.r==ix &&
55c0: 20 69 78 3e 53 4d 41 4c 4c 45 53 54 5f 49 4e 54   ix>SMALLEST_INT
55d0: 36 34 20 26 26 20 69 78 3c 4c 41 52 47 45 53 54  64 && ix<LARGEST
55e0: 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 70 4d  _INT64 ){.    pM
55f0: 65 6d 2d 3e 75 2e 69 20 3d 20 69 78 3b 0a 20 20  em->u.i = ix;.  
5600: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
5610: 28 70 4d 65 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pMem, MEM_Int);
5620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
5630: 6e 76 65 72 74 20 70 4d 65 6d 20 74 6f 20 74 79  nvert pMem to ty
5640: 70 65 20 69 6e 74 65 67 65 72 2e 20 20 49 6e 76  pe integer.  Inv
5650: 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 69 6f  alidate any prio
5660: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
5670: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
5680: 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
5690: 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  fy(Mem *pMem){. 
56a0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
56b0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
56c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
56d0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
56e0: 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
56f0: 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
5700: 28 70 4d 65 6d 29 20 29 3b 0a 20 20 61 73 73 65  (pMem) );.  asse
5710: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
5720: 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
5730: 3b 0a 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  ;..  pMem->u.i =
5740: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
5750: 61 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 4d 65  alue(pMem);.  Me
5760: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65  mSetTypeFlag(pMe
5770: 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 72  m, MEM_Int);.  r
5780: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
57a0: 74 20 70 4d 65 6d 20 73 6f 20 74 68 61 74 20 69  t pMem so that i
57b0: 74 20 69 73 20 6f 66 20 74 79 70 65 20 4d 45 4d  t is of type MEM
57c0: 5f 52 65 61 6c 2e 0a 2a 2a 20 49 6e 76 61 6c 69  _Real..** Invali
57d0: 64 61 74 65 20 61 6e 79 20 70 72 69 6f 72 20 72  date any prior r
57e0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a  epresentations..
57f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5800: 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 4d 65 6d  beMemRealify(Mem
5810: 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72   *pMem){.  asser
5820: 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c  t( pMem->db==0 |
5830: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
5840: 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  held(pMem->db->m
5850: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5860: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
5870: 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
5880: 0a 0a 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20  ..  pMem->u.r = 
5890: 73 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56  sqlite3VdbeRealV
58a0: 61 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 4d 65  alue(pMem);.  Me
58b0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65  mSetTypeFlag(pMe
58c0: 6d 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20  m, MEM_Real);.  
58d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
58e0: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
58f0: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
5900: 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 69 6e 74   value to an int
5910: 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 72  eger.  Return tr
5920: 75 65 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  ue if the two.**
5930: 20 76 61 6c 75 65 73 20 61 72 65 20 74 68 65 20   values are the 
5940: 73 61 6d 65 20 77 69 74 68 69 6e 20 74 68 65 20  same within the 
5950: 70 72 65 63 69 73 69 6f 6e 20 6f 66 20 74 68 65  precision of the
5960: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
5970: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
5980: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
5990: 65 73 20 74 68 61 74 20 69 20 77 61 73 20 6f 62  es that i was ob
59a0: 74 61 69 6e 65 64 20 62 79 20 61 73 73 69 67 6e  tained by assign
59b0: 6d 65 6e 74 20 66 72 6f 6d 20 72 31 2e 0a 2a 2a  ment from r1..**
59c0: 0a 2a 2a 20 46 6f 72 20 73 6f 6d 65 20 76 65 72  .** For some ver
59d0: 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 6f 6e 20  sions of GCC on 
59e0: 33 32 2d 62 69 74 20 6d 61 63 68 69 6e 65 73 2c  32-bit machines,
59f0: 20 69 66 20 79 6f 75 20 64 6f 20 74 68 65 20 6d   if you do the m
5a00: 6f 72 65 20 6f 62 76 69 6f 75 73 0a 2a 2a 20 63  ore obvious.** c
5a10: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 22 72 31  omparison of "r1
5a20: 3d 3d 28 64 6f 75 62 6c 65 29 69 22 20 79 6f 75  ==(double)i" you
5a30: 20 73 6f 6d 65 74 69 6d 65 73 20 67 65 74 20 61   sometimes get a
5a40: 6e 20 61 6e 73 77 65 72 20 6f 66 20 66 61 6c 73  n answer of fals
5a50: 65 20 65 76 65 6e 0a 2a 2a 20 74 68 6f 75 67 68  e even.** though
5a60: 20 74 68 65 20 72 31 20 61 6e 64 20 28 64 6f 75   the r1 and (dou
5a70: 62 6c 65 29 69 20 76 61 6c 75 65 73 20 61 72 65  ble)i values are
5a80: 20 62 69 74 2d 66 6f 72 2d 62 69 74 20 74 68 65   bit-for-bit the
5a90: 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   same..*/.int sq
5aa0: 6c 69 74 65 33 52 65 61 6c 53 61 6d 65 41 73 49  lite3RealSameAsI
5ab0: 6e 74 28 64 6f 75 62 6c 65 20 72 31 2c 20 73 71  nt(double r1, sq
5ac0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 29 7b 0a  lite3_int64 i){.
5ad0: 20 20 64 6f 75 62 6c 65 20 72 32 20 3d 20 28 64    double r2 = (d
5ae0: 6f 75 62 6c 65 29 69 3b 0a 20 20 72 65 74 75 72  ouble)i;.  retur
5af0: 6e 20 72 31 3d 3d 30 2e 30 0a 20 20 20 20 20 20  n r1==0.0.      
5b00: 7c 7c 20 28 6d 65 6d 63 6d 70 28 26 72 31 2c 20  || (memcmp(&r1, 
5b10: 26 72 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &r2, sizeof(r1))
5b20: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
5b30: 20 69 20 3e 3d 20 2d 32 32 35 31 37 39 39 38 31   i >= -225179981
5b40: 33 36 38 35 32 34 38 20 26 26 20 69 20 3c 20 32  3685248 && i < 2
5b50: 32 35 31 37 39 39 38 31 33 36 38 35 32 34 38 29  251799813685248)
5b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
5b70: 72 74 20 70 4d 65 6d 20 73 6f 20 74 68 61 74 20  rt pMem so that 
5b80: 69 74 20 68 61 73 20 74 79 70 65 20 4d 45 4d 5f  it has type MEM_
5b90: 52 65 61 6c 20 6f 72 20 4d 45 4d 5f 49 6e 74 2e  Real or MEM_Int.
5ba0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61  .** Invalidate a
5bb0: 6e 79 20 70 72 69 6f 72 20 72 65 70 72 65 73 65  ny prior represe
5bc0: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ntations..**.** 
5bd0: 45 76 65 72 79 20 65 66 66 6f 72 74 20 69 73 20  Every effort is 
5be0: 6d 61 64 65 20 74 6f 20 66 6f 72 63 65 20 74 68  made to force th
5bf0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 2c 20 65 76  e conversion, ev
5c00: 65 6e 20 69 66 20 74 68 65 20 69 6e 70 75 74 0a  en if the input.
5c10: 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 74  ** is a string t
5c20: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
5c30: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6c 69 6b  k completely lik
5c40: 65 20 61 20 6e 75 6d 62 65 72 2e 20 20 43 6f 6e  e a number.  Con
5c50: 76 65 72 74 0a 2a 2a 20 61 73 20 6d 75 63 68 20  vert.** as much 
5c60: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
5c70: 20 77 65 20 63 61 6e 20 61 6e 64 20 69 67 6e 6f   we can and igno
5c80: 72 65 20 74 68 65 20 72 65 73 74 2e 0a 2a 2f 0a  re the rest..*/.
5c90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
5ca0: 65 6d 4e 75 6d 65 72 69 66 79 28 4d 65 6d 20 2a  emNumerify(Mem *
5cb0: 70 4d 65 6d 29 7b 0a 20 20 74 65 73 74 63 61 73  pMem){.  testcas
5cc0: 65 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  e( pMem->flags &
5cd0: 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 74 65   MEM_Int );.  te
5ce0: 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 66 6c  stcase( pMem->fl
5cf0: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
5d00: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4d  ;.  testcase( pM
5d10: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
5d20: 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 74 65 73  IntReal );.  tes
5d30: 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 66 6c 61  tcase( pMem->fla
5d40: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
5d50: 0a 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c  .  if( (pMem->fl
5d60: 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d  ags & (MEM_Int|M
5d70: 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52  EM_Real|MEM_IntR
5d80: 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 3d 3d  eal|MEM_Null))==
5d90: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  0 ){.    int rc;
5da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
5db0: 36 34 20 69 78 3b 0a 20 20 20 20 61 73 73 65 72  64 ix;.    asser
5dc0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
5dd0: 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  & (MEM_Blob|MEM_
5de0: 53 74 72 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  Str))!=0 );.    
5df0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
5e00: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
5e10: 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e  utex_held(pMem->
5e20: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5e30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 74    rc = sqlite3At
5e40: 6f 46 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65  oF(pMem->z, &pMe
5e50: 6d 2d 3e 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c  m->u.r, pMem->n,
5e60: 20 70 4d 65 6d 2d 3e 65 6e 63 29 3b 0a 20 20 20   pMem->enc);.   
5e70: 20 69 66 28 20 28 28 72 63 3d 3d 30 20 7c 7c 20   if( ((rc==0 || 
5e80: 72 63 3d 3d 31 29 20 26 26 20 73 71 6c 69 74 65  rc==1) && sqlite
5e90: 33 41 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c  3Atoi64(pMem->z,
5ea0: 20 26 69 78 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70   &ix, pMem->n, p
5eb0: 4d 65 6d 2d 3e 65 6e 63 29 3c 3d 31 29 0a 20 20  Mem->enc)<=1).  
5ec0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 52 65 61     || sqlite3Rea
5ed0: 6c 53 61 6d 65 41 73 49 6e 74 28 70 4d 65 6d 2d  lSameAsInt(pMem-
5ee0: 3e 75 2e 72 2c 20 28 69 78 20 3d 20 28 69 36 34  >u.r, (ix = (i64
5ef0: 29 70 4d 65 6d 2d 3e 75 2e 72 29 29 0a 20 20 20  )pMem->u.r)).   
5f00: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
5f10: 75 2e 69 20 3d 20 69 78 3b 0a 20 20 20 20 20 20  u.i = ix;.      
5f20: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
5f30: 4d 65 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Mem, MEM_Int);. 
5f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5f50: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
5f60: 4d 65 6d 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a  Mem, MEM_Real);.
5f70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
5f80: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
5f90: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
5fa0: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  Real|MEM_IntReal
5fb0: 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 21 3d 30 20 29  |MEM_Null))!=0 )
5fc0: 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  ;.  pMem->flags 
5fd0: 26 3d 20 7e 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  &= ~(MEM_Str|MEM
5fe0: 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b  _Blob|MEM_Zero);
5ff0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6000: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
6010: 73 74 20 74 68 65 20 64 61 74 61 74 79 70 65 20  st the datatype 
6020: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  of the value in 
6030: 70 4d 65 6d 20 61 63 63 6f 72 64 69 6e 67 20 74  pMem according t
6040: 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 0a 2a  o the affinity.*
6050: 2a 20 22 61 66 66 22 2e 20 20 43 61 73 74 69 6e  * "aff".  Castin
6060: 67 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  g is different f
6070: 72 6f 6d 20 61 70 70 6c 79 69 6e 67 20 61 66 66  rom applying aff
6080: 69 6e 69 74 79 20 69 6e 20 74 68 61 74 20 61 20  inity in that a 
6090: 63 61 73 74 0a 2a 2a 20 69 73 20 66 6f 72 63 65  cast.** is force
60a0: 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  d.  In other wor
60b0: 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 69 73  ds, the value is
60c0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
60d0: 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 61  the desired.** a
60e0: 66 66 69 6e 69 74 79 20 65 76 65 6e 20 69 66 20  ffinity even if 
60f0: 74 68 61 74 20 72 65 73 75 6c 74 73 20 69 6e 20  that results in 
6100: 6c 6f 73 73 20 6f 66 20 64 61 74 61 2e 20 20 54  loss of data.  T
6110: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
6120: 2a 20 75 73 65 64 20 28 66 6f 72 20 65 78 61 6d  * used (for exam
6130: 70 6c 65 29 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ple) to implemen
6140: 74 20 74 68 65 20 53 51 4c 20 22 63 61 73 74 28  t the SQL "cast(
6150: 29 22 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  )" operator..*/.
6160: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6170: 4d 65 6d 43 61 73 74 28 4d 65 6d 20 2a 70 4d 65  MemCast(Mem *pMe
6180: 6d 2c 20 75 38 20 61 66 66 2c 20 75 38 20 65 6e  m, u8 aff, u8 en
6190: 63 6f 64 69 6e 67 29 7b 0a 20 20 69 66 28 20 70  coding){.  if( p
61a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
61b0: 5f 4e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  _Null ) return;.
61c0: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
61d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
61e0: 5f 41 46 46 5f 42 4c 4f 42 3a 20 7b 20 20 20 2f  _AFF_BLOB: {   /
61f0: 2a 20 52 65 61 6c 6c 79 20 61 20 63 61 73 74 20  * Really a cast 
6200: 74 6f 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  to BLOB */.     
6210: 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67   if( (pMem->flag
6220: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30  s & MEM_Blob)==0
6230: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6240: 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
6250: 69 6e 69 74 79 28 70 4d 65 6d 2c 20 53 51 4c 49  inity(pMem, SQLI
6260: 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63  TE_AFF_TEXT, enc
6270: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  oding);.        
6280: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
6290: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
62a0: 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
62b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
62c0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
62d0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 20 4d  gs & MEM_Str ) M
62e0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d  emSetTypeFlag(pM
62f0: 65 6d 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20  em, MEM_Blob);. 
6300: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6310: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6320: 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d 61 73  &= ~(MEM_TypeMas
6330: 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20  k&~MEM_Blob);.  
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6350: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6360: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  e SQLITE_AFF_NUM
6370: 45 52 49 43 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERIC: {.      sq
6380: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65  lite3VdbeMemNume
6390: 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20  rify(pMem);.    
63a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
63b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
63c0: 46 46 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  FF_INTEGER: {.  
63d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
63e0: 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65  emIntegerify(pMe
63f0: 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
6400: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6410: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a  SQLITE_AFF_REAL:
6420: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6430: 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70  VdbeMemRealify(p
6440: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Mem);.      brea
6450: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6460: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
6470: 73 65 72 74 28 20 61 66 66 3d 3d 53 51 4c 49 54  sert( aff==SQLIT
6480: 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
6490: 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 5f      assert( MEM_
64a0: 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e 3e  Str==(MEM_Blob>>
64b0: 33 29 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  3) );.      pMem
64c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 4d 65 6d  ->flags |= (pMem
64d0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
64e0: 29 3e 3e 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  )>>3;.      sqli
64f0: 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
6500: 69 6e 69 74 79 28 70 4d 65 6d 2c 20 53 51 4c 49  inity(pMem, SQLI
6510: 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e 63  TE_AFF_TEXT, enc
6520: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73  oding);.      as
6530: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
6540: 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 70  s & MEM_Str || p
6550: 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
6560: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 70  ailed );.      p
6570: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Mem->flags &= ~(
6580: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
6590: 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45 4d  |MEM_IntReal|MEM
65a0: 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b  _Blob|MEM_Zero);
65b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
65c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
65d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 62 75 6c 6b   Initialize bulk
65e0: 20 6d 65 6d 6f 72 79 20 74 6f 20 62 65 20 61 20   memory to be a 
65f0: 63 6f 6e 73 69 73 74 65 6e 74 20 4d 65 6d 20 6f  consistent Mem o
6600: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
6610: 20 6d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   minimum amount 
6620: 6f 66 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  of initializatio
6630: 6e 20 66 65 61 73 69 62 6c 65 20 69 73 20 70 65  n feasible is pe
6640: 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 76 6f 69 64  rformed..*/.void
6650: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
6660: 6e 69 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 73  nit(Mem *pMem, s
6670: 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20  qlite3 *db, u16 
6680: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
6690: 28 20 28 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f  ( (flags & ~MEM_
66a0: 54 79 70 65 4d 61 73 6b 29 3d 3d 30 20 29 3b 0a  TypeMask)==0 );.
66b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
66c0: 66 6c 61 67 73 3b 0a 20 20 70 4d 65 6d 2d 3e 64  flags;.  pMem->d
66d0: 62 20 3d 20 64 62 3b 0a 20 20 70 4d 65 6d 2d 3e  b = db;.  pMem->
66e0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 7d 0a  szMalloc = 0;.}.
66f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6700: 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ny previous valu
6710: 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61  e and set the va
6720: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  lue stored in *p
6730: 4d 65 6d 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  Mem to NULL..**.
6740: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6750: 63 61 6c 6c 73 20 74 68 65 20 4d 65 6d 2e 78 44  calls the Mem.xD
6760: 65 6c 20 64 65 73 74 72 75 63 74 6f 72 20 74 6f  el destructor to
6770: 20 64 69 73 70 6f 73 65 20 6f 66 20 76 61 6c 75   dispose of valu
6780: 65 73 20 74 68 61 74 0a 2a 2a 20 72 65 71 75 69  es that.** requi
6790: 72 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  re the destructo
67a0: 72 2e 20 20 42 75 74 20 69 74 20 70 72 65 73 65  r.  But it prese
67b0: 72 76 65 73 20 74 68 65 20 4d 65 6d 2e 7a 4d 61  rves the Mem.zMa
67c0: 6c 6c 6f 63 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  lloc memory allo
67d0: 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20 66 72  cation..** To fr
67e0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
67f0: 2c 20 75 73 65 20 73 71 6c 69 74 65 33 56 64 62  , use sqlite3Vdb
6800: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 2c 20 77  eMemRelease(), w
6810: 68 69 63 68 20 62 6f 74 68 20 63 61 6c 6c 73 20  hich both calls 
6820: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
6830: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  to invoke the de
6840: 73 74 72 75 63 74 6f 72 20 61 6e 64 20 64 65 61  structor and dea
6850: 6c 6c 6f 63 61 74 65 73 20 4d 65 6d 2e 7a 4d 61  llocates Mem.zMa
6860: 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  lloc..**.** Use 
6870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
6880: 72 65 73 65 74 20 74 68 65 20 4d 65 6d 20 70 72  reset the Mem pr
6890: 69 6f 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  ior to insert a 
68a0: 6e 65 77 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  new value..**.**
68b0: 20 55 73 65 20 73 71 6c 69 74 65 33 56 64 62 65   Use sqlite3Vdbe
68c0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 74 6f 20  MemRelease() to 
68d0: 63 6f 6d 70 6c 65 74 65 20 65 72 61 73 65 20 74  complete erase t
68e0: 68 65 20 4d 65 6d 20 70 72 69 6f 72 20 74 6f 20  he Mem prior to 
68f0: 61 62 61 6e 64 6f 6e 69 6e 67 20 69 74 2e 0a 2a  abandoning it..*
6900: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6910: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 4d 65 6d  beMemSetNull(Mem
6920: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 56   *pMem){.  if( V
6930: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4d  dbeMemDynamic(pM
6940: 65 6d 29 20 29 7b 0a 20 20 20 20 76 64 62 65 4d  em) ){.    vdbeM
6950: 65 6d 43 6c 65 61 72 45 78 74 65 72 6e 41 6e 64  emClearExternAnd
6960: 53 65 74 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a 20  SetNull(pMem);. 
6970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d   }else{.    pMem
6980: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
6990: 6c 6c 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  ll;.  }.}.void s
69a0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e 75  qlite3ValueSetNu
69b0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ll(sqlite3_value
69c0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 56   *p){.  sqlite3V
69d0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 28 4d  dbeMemSetNull((M
69e0: 65 6d 2a 29 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  em*)p); .}../*.*
69f0: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65  * Delete any pre
6a00: 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20  vious value and 
6a10: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 74 6f  set the value to
6a20: 20 62 65 20 61 20 42 4c 4f 42 20 6f 66 20 6c 65   be a BLOB of le
6a30: 6e 67 74 68 0a 2a 2a 20 6e 20 63 6f 6e 74 61 69  ngth.** n contai
6a40: 6e 69 6e 67 20 61 6c 6c 20 7a 65 72 6f 73 2e 0a  ning all zeros..
6a50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6a60: 64 62 65 4d 65 6d 53 65 74 5a 65 72 6f 42 6c 6f  dbeMemSetZeroBlo
6a70: 62 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  b(Mem *pMem, int
6a80: 20 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64   n){.  sqlite3Vd
6a90: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
6aa0: 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  m);.  pMem->flag
6ab0: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  s = MEM_Blob|MEM
6ac0: 5f 5a 65 72 6f 3b 0a 20 20 70 4d 65 6d 2d 3e 6e  _Zero;.  pMem->n
6ad0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20   = 0;.  if( n<0 
6ae0: 29 20 6e 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d  ) n = 0;.  pMem-
6af0: 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 3b 0a 20 20  >u.nZero = n;.  
6b00: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6b10: 54 45 5f 55 54 46 38 3b 0a 20 20 70 4d 65 6d 2d  TE_UTF8;.  pMem-
6b20: 3e 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >z = 0;.}../*.**
6b30: 20 54 68 65 20 70 4d 65 6d 20 69 73 20 6b 6e 6f   The pMem is kno
6b40: 77 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 63 6f  wn to contain co
6b50: 6e 74 65 6e 74 20 74 68 61 74 20 6e 65 65 64 73  ntent that needs
6b60: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
6b70: 20 70 72 69 6f 72 0a 2a 2a 20 74 6f 20 61 20 76   prior.** to a v
6b80: 61 6c 75 65 20 63 68 61 6e 67 65 2e 20 20 53 6f  alue change.  So
6b90: 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
6ba0: 72 75 63 74 6f 72 2c 20 74 68 65 6e 20 73 65 74  ructor, then set
6bb0: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 0a 2a 2a   the value to.**
6bc0: 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
6bd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  r..*/.static SQL
6be0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
6bf0: 64 20 76 64 62 65 52 65 6c 65 61 73 65 41 6e 64  d vdbeReleaseAnd
6c00: 53 65 74 49 6e 74 36 34 28 4d 65 6d 20 2a 70 4d  SetInt64(Mem *pM
6c10: 65 6d 2c 20 69 36 34 20 76 61 6c 29 7b 0a 20 20  em, i64 val){.  
6c20: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
6c30: 74 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a 20 20 70  tNull(pMem);.  p
6c40: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 61 6c 3b 0a  Mem->u.i = val;.
6c50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6c60: 4d 45 4d 5f 49 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  MEM_Int;.}../*.*
6c70: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65  * Delete any pre
6c80: 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20  vious value and 
6c90: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 73 74  set the value st
6ca0: 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f  ored in *pMem to
6cb0: 20 76 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73   val,.** manifes
6cc0: 74 20 74 79 70 65 20 49 4e 54 45 47 45 52 2e 0a  t type INTEGER..
6cd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6ce0: 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 4d  dbeMemSetInt64(M
6cf0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 36 34 20 76 61  em *pMem, i64 va
6d00: 6c 29 7b 0a 20 20 69 66 28 20 56 64 62 65 4d 65  l){.  if( VdbeMe
6d10: 6d 44 79 6e 61 6d 69 63 28 70 4d 65 6d 29 20 29  mDynamic(pMem) )
6d20: 7b 0a 20 20 20 20 76 64 62 65 52 65 6c 65 61 73  {.    vdbeReleas
6d30: 65 41 6e 64 53 65 74 49 6e 74 36 34 28 70 4d 65  eAndSetInt64(pMe
6d40: 6d 2c 20 76 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  m, val);.  }else
6d50: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  {.    pMem->u.i 
6d60: 3d 20 76 61 6c 3b 0a 20 20 20 20 70 4d 65 6d 2d  = val;.    pMem-
6d70: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6d80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 41 20 6e 6f  ;.  }.}../* A no
6d90: 2d 6f 70 20 64 65 73 74 72 75 63 74 6f 72 20 2a  -op destructor *
6da0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 6f  /.void sqlite3No
6db0: 6f 70 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69  opDestructor(voi
6dc0: 64 20 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41  d *p){ UNUSED_PA
6dd0: 52 41 4d 45 54 45 52 28 70 29 3b 20 7d 0a 0a 2f  RAMETER(p); }../
6de0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
6df0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d  ue stored in *pM
6e00: 65 6d 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  em should alread
6e10: 79 20 62 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 20  y be a NULL..** 
6e20: 41 6c 73 6f 20 73 74 6f 72 65 20 61 20 70 6f 69  Also store a poi
6e30: 6e 74 65 72 20 74 6f 20 67 6f 20 77 69 74 68 20  nter to go with 
6e40: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
6e50: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 50 6f 69  te3VdbeMemSetPoi
6e60: 6e 74 65 72 28 0a 20 20 4d 65 6d 20 2a 70 4d 65  nter(.  Mem *pMe
6e70: 6d 2c 0a 20 20 76 6f 69 64 20 2a 70 50 74 72 2c  m,.  void *pPtr,
6e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6e90: 50 54 79 70 65 2c 0a 20 20 76 6f 69 64 20 28 2a  PType,.  void (*
6ea0: 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69  xDestructor)(voi
6eb0: 64 2a 29 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  d*).){.  assert(
6ec0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3d 3d 4d 45   pMem->flags==ME
6ed0: 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 70 4d 65 6d  M_Null );.  pMem
6ee0: 2d 3e 75 2e 7a 50 54 79 70 65 20 3d 20 7a 50 54  ->u.zPType = zPT
6ef0: 79 70 65 20 3f 20 7a 50 54 79 70 65 20 3a 20 22  ype ? zPType : "
6f00: 22 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70  ";.  pMem->z = p
6f10: 50 74 72 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61  Ptr;.  pMem->fla
6f20: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  gs = MEM_Null|ME
6f30: 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 75 62 74 79 70  M_Dyn|MEM_Subtyp
6f40: 65 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4d  e|MEM_Term;.  pM
6f50: 65 6d 2d 3e 65 53 75 62 74 79 70 65 20 3d 20 27  em->eSubtype = '
6f60: 70 27 3b 0a 20 20 70 4d 65 6d 2d 3e 78 44 65 6c  p';.  pMem->xDel
6f70: 20 3d 20 78 44 65 73 74 72 75 63 74 6f 72 20 3f   = xDestructor ?
6f80: 20 78 44 65 73 74 72 75 63 74 6f 72 20 3a 20 73   xDestructor : s
6f90: 71 6c 69 74 65 33 4e 6f 6f 70 44 65 73 74 72 75  qlite3NoopDestru
6fa0: 63 74 6f 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ctor;.}..#ifndef
6fb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
6fc0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
6fd0: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65  * Delete any pre
6fe0: 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20  vious value and 
6ff0: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 73 74  set the value st
7000: 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f  ored in *pMem to
7010: 20 76 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73   val,.** manifes
7020: 74 20 74 79 70 65 20 52 45 41 4c 2e 0a 2a 2f 0a  t type REAL..*/.
7030: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7040: 4d 65 6d 53 65 74 44 6f 75 62 6c 65 28 4d 65 6d  MemSetDouble(Mem
7050: 20 2a 70 4d 65 6d 2c 20 64 6f 75 62 6c 65 20 76   *pMem, double v
7060: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
7070: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65  beMemSetNull(pMe
7080: 6d 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  m);.  if( !sqlit
7090: 65 33 49 73 4e 61 4e 28 76 61 6c 29 20 29 7b 0a  e3IsNaN(val) ){.
70a0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20      pMem->u.r = 
70b0: 76 61 6c 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  val;.    pMem->f
70c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
70d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
70e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
70f0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
7100: 74 72 75 65 20 69 66 20 74 68 65 20 4d 65 6d 20  true if the Mem 
7110: 68 6f 6c 64 73 20 61 20 52 6f 77 53 65 74 20 6f  holds a RowSet o
7120: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 72 6f 75  bject.  This rou
7130: 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tine is intended
7140: 0a 2a 2a 20 66 6f 72 20 75 73 65 20 69 6e 73 69  .** for use insi
7150: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
7160: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
7170: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
7180: 49 73 52 6f 77 53 65 74 28 63 6f 6e 73 74 20 4d  IsRowSet(const M
7190: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 72 65 74  em *pMem){.  ret
71a0: 75 72 6e 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  urn (pMem->flags
71b0: 26 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 44  &(MEM_Blob|MEM_D
71c0: 79 6e 29 29 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 7c  yn))==(MEM_Blob|
71d0: 4d 45 4d 5f 44 79 6e 29 0a 20 20 20 20 20 20 20  MEM_Dyn).       
71e0: 20 20 26 26 20 70 4d 65 6d 2d 3e 78 44 65 6c 3d    && pMem->xDel=
71f0: 3d 73 71 6c 69 74 65 33 52 6f 77 53 65 74 44 65  =sqlite3RowSetDe
7200: 6c 65 74 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  lete;.}.#endif..
7210: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79  /*.** Delete any
7220: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   previous value 
7230: 61 6e 64 20 73 65 74 20 74 68 65 20 76 61 6c 75  and set the valu
7240: 65 20 6f 66 20 70 4d 65 6d 20 74 6f 20 62 65 20  e of pMem to be 
7250: 61 6e 0a 2a 2a 20 65 6d 70 74 79 20 62 6f 6f 6c  an.** empty bool
7260: 65 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ean index..**.**
7270: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
7280: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
7290: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
72a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
72b0: 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
72c0: 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
72d0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f  ite3VdbeMemSetRo
72e0: 77 53 65 74 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b  wSet(Mem *pMem){
72f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7300: 20 70 4d 65 6d 2d 3e 64 62 3b 0a 20 20 52 6f 77   pMem->db;.  Row
7310: 53 65 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  Set *p;.  assert
7320: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
7330: 65 72 74 28 20 21 73 71 6c 69 74 65 33 56 64 62  ert( !sqlite3Vdb
7340: 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65  eMemIsRowSet(pMe
7350: 6d 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  m) );.  sqlite3V
7360: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
7370: 65 6d 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  em);.  p = sqlit
7380: 65 33 52 6f 77 53 65 74 49 6e 69 74 28 64 62 29  e3RowSetInit(db)
7390: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
73a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
73b0: 45 4d 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  EM;.  pMem->z = 
73c0: 28 63 68 61 72 2a 29 70 3b 0a 20 20 70 4d 65 6d  (char*)p;.  pMem
73d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
73e0: 6f 62 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 70 4d  ob|MEM_Dyn;.  pM
73f0: 65 6d 2d 3e 78 44 65 6c 20 3d 20 73 71 6c 69 74  em->xDel = sqlit
7400: 65 33 52 6f 77 53 65 74 44 65 6c 65 74 65 3b 0a  e3RowSetDelete;.
7410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7420: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
7430: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
7440: 4d 65 6d 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  Mem object conta
7450: 69 6e 73 20 61 20 54 45 58 54 20 6f 72 20 42 4c  ins a TEXT or BL
7460: 4f 42 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 6f  OB that is.** to
7470: 6f 20 6c 61 72 67 65 20 2d 20 77 68 6f 73 65 20  o large - whose 
7480: 73 69 7a 65 20 65 78 63 65 65 64 73 20 53 51 4c  size exceeds SQL
7490: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2e 0a  ITE_MAX_LENGTH..
74a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
74b0: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 4d 65 6d 20  beMemTooBig(Mem 
74c0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
74d0: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
74e0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d   p->flags & (MEM
74f0: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
7500: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d  {.    int n = p-
7510: 3e 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66  >n;.    if( p->f
7520: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
7530: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 70 2d  ){.      n += p-
7540: 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a  >u.nZero;.    }.
7550: 20 20 20 20 72 65 74 75 72 6e 20 6e 3e 70 2d 3e      return n>p->
7560: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7570: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b  E_LIMIT_LENGTH];
7580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7590: 20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   .}..#ifdef SQLI
75a0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
75b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
75c0: 61 72 65 73 20 61 20 6d 65 6d 6f 72 79 20 63 65  ares a memory ce
75d0: 6c 6c 20 66 6f 72 20 6d 6f 64 69 66 69 63 61 74  ll for modificat
75e0: 69 6f 6e 20 62 79 20 62 72 65 61 6b 69 6e 67 0a  ion by breaking.
75f0: 2a 2a 20 69 74 73 20 6c 69 6e 6b 20 74 6f 20 61  ** its link to a
7600: 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 61 6e   shallow copy an
7610: 64 20 62 79 20 6d 61 72 6b 69 6e 67 20 61 6e 79  d by marking any
7620: 20 63 75 72 72 65 6e 74 20 73 68 61 6c 6c 6f 77   current shallow
7630: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 74 68  .** copies of th
7640: 69 73 20 63 65 6c 6c 20 61 73 20 69 6e 76 61 6c  is cell as inval
7650: 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  id..**.** This i
7660: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
7670: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
7680: 20 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65 20   only - to make 
7690: 73 75 72 65 20 73 68 61 6c 6c 6f 77 0a 2a 2a 20  sure shallow.** 
76a0: 63 6f 70 69 65 73 20 61 72 65 20 6e 6f 74 20 6d  copies are not m
76b0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  isused..*/.void 
76c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62  sqlite3VdbeMemAb
76d0: 6f 75 74 54 6f 43 68 61 6e 67 65 28 56 64 62 65  outToChange(Vdbe
76e0: 20 2a 70 56 64 62 65 2c 20 4d 65 6d 20 2a 70 4d   *pVdbe, Mem *pM
76f0: 65 6d 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  em){.  int i;.  
7700: 4d 65 6d 20 2a 70 58 3b 0a 20 20 66 6f 72 28 69  Mem *pX;.  for(i
7710: 3d 30 2c 20 70 58 3d 70 56 64 62 65 2d 3e 61 4d  =0, pX=pVdbe->aM
7720: 65 6d 3b 20 69 3c 70 56 64 62 65 2d 3e 6e 4d 65  em; i<pVdbe->nMe
7730: 6d 3b 20 69 2b 2b 2c 20 70 58 2b 2b 29 7b 0a 20  m; i++, pX++){. 
7740: 20 20 20 69 66 28 20 70 58 2d 3e 70 53 63 6f 70     if( pX->pScop
7750: 79 46 72 6f 6d 3d 3d 70 4d 65 6d 20 29 7b 0a 20  yFrom==pMem ){. 
7760: 20 20 20 20 20 2f 2a 20 49 66 20 70 58 20 69 73       /* If pX is
7770: 20 6d 61 72 6b 65 64 20 61 73 20 61 20 73 68 61   marked as a sha
7780: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 70 4d 65  llow copy of pMe
7790: 6d 2c 20 74 68 65 6e 20 76 65 72 69 66 79 20 74  m, then verify t
77a0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  hat.      ** no 
77b0: 73 69 67 6e 69 66 69 63 61 6e 74 20 63 68 61 6e  significant chan
77c0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
77d0: 64 65 20 74 6f 20 70 58 20 73 69 6e 63 65 20 74  de to pX since t
77e0: 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 20 20 20  he OP_SCopy..   
77f0: 20 20 20 2a 2a 20 41 20 73 69 67 6e 69 66 69 63     ** A signific
7800: 61 6e 74 20 63 68 61 6e 67 65 20 77 6f 75 6c 64  ant change would
7810: 20 69 6e 64 69 63 61 74 65 64 20 61 20 6d 69 73   indicated a mis
7820: 73 65 64 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  sed call to this
7830: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
7840: 6f 6e 20 66 6f 72 20 70 58 2e 20 20 4d 69 6e 6f  on for pX.  Mino
7850: 72 20 63 68 61 6e 67 65 73 2c 20 73 75 63 68 20  r changes, such 
7860: 61 73 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  as adding or rem
7870: 6f 76 69 6e 67 20 61 0a 20 20 20 20 20 20 2a 2a  oving a.      **
7880: 20 64 75 61 6c 20 74 79 70 65 2c 20 61 72 65 20   dual type, are 
7890: 61 6c 6c 6f 77 65 64 2c 20 61 73 20 6c 6f 6e 67  allowed, as long
78a0: 20 61 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69   as the underlyi
78b0: 6e 67 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a  ng value is the.
78c0: 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 2e 20 2a        ** same. *
78d0: 2f 0a 20 20 20 20 20 20 75 31 36 20 6d 46 6c 61  /.      u16 mFla
78e0: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
78f0: 20 26 20 70 58 2d 3e 66 6c 61 67 73 20 26 20 70   & pX->flags & p
7900: 58 2d 3e 6d 53 63 6f 70 79 46 6c 61 67 73 3b 0a  X->mScopyFlags;.
7910: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d        assert( (m
7920: 46 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  Flags&(MEM_Int|M
7930: 45 4d 5f 49 6e 74 52 65 61 6c 29 29 3d 3d 30 20  EM_IntReal))==0 
7940: 7c 7c 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 70 58  || pMem->u.i==pX
7950: 2d 3e 75 2e 69 20 29 3b 0a 20 20 20 20 20 20 61  ->u.i );.      a
7960: 73 73 65 72 74 28 20 28 6d 46 6c 61 67 73 26 4d  ssert( (mFlags&M
7970: 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 7c 7c 20 70  EM_Real)==0 || p
7980: 4d 65 6d 2d 3e 75 2e 72 3d 3d 70 58 2d 3e 75 2e  Mem->u.r==pX->u.
7990: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
79a0: 74 28 20 28 6d 46 6c 61 67 73 26 4d 45 4d 5f 53  t( (mFlags&MEM_S
79b0: 74 72 29 3d 3d 30 20 20 7c 7c 20 28 70 4d 65 6d  tr)==0  || (pMem
79c0: 2d 3e 6e 3d 3d 70 58 2d 3e 6e 20 26 26 20 70 4d  ->n==pX->n && pM
79d0: 65 6d 2d 3e 7a 3d 3d 70 58 2d 3e 7a 29 20 29 3b  em->z==pX->z) );
79e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
79f0: 6d 46 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 29  mFlags&MEM_Blob)
7a00: 3d 3d 30 20 20 7c 7c 20 73 71 6c 69 74 65 33 42  ==0  || sqlite3B
7a10: 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 2c  lobCompare(pMem,
7a20: 70 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pX)==0 );.      
7a30: 0a 20 20 20 20 20 20 2f 2a 20 70 4d 65 6d 20 69  .      /* pMem i
7a40: 73 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  s the register t
7a50: 68 61 74 20 69 73 20 63 68 61 6e 67 69 6e 67 2e  hat is changing.
7a60: 20 20 42 75 74 20 61 6c 73 6f 20 6d 61 72 6b 20    But also mark 
7a70: 70 58 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 75  pX as.      ** u
7a80: 6e 64 65 66 69 6e 65 64 20 73 6f 20 74 68 61 74  ndefined so that
7a90: 20 77 65 20 63 61 6e 20 71 75 69 63 6b 6c 79 20   we can quickly 
7aa0: 64 65 74 65 63 74 20 74 68 65 20 73 68 61 6c 6c  detect the shall
7ab0: 6f 77 2d 63 6f 70 79 20 65 72 72 6f 72 20 2a 2f  ow-copy error */
7ac0: 0a 20 20 20 20 20 20 70 58 2d 3e 66 6c 61 67 73  .      pX->flags
7ad0: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
7ae0: 3b 0a 20 20 20 20 20 20 70 58 2d 3e 70 53 63 6f  ;.      pX->pSco
7af0: 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  pyFrom = 0;.    
7b00: 7d 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 70 53  }.  }.  pMem->pS
7b10: 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 7d 0a  copyFrom = 0;.}.
7b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7b30: 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _DEBUG */.../*.*
7b40: 2a 20 4d 61 6b 65 20 61 6e 20 73 68 61 6c 6c 6f  * Make an shallo
7b50: 77 20 63 6f 70 79 20 6f 66 20 70 46 72 6f 6d 20  w copy of pFrom 
7b60: 69 6e 74 6f 20 70 54 6f 2e 20 20 50 72 69 6f 72  into pTo.  Prior
7b70: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
7b80: 70 54 6f 20 61 72 65 20 66 72 65 65 64 2e 20 20  pTo are freed.  
7b90: 54 68 65 20 70 46 72 6f 6d 2d 3e 7a 20 66 69 65  The pFrom->z fie
7ba0: 6c 64 20 69 73 20 6e 6f 74 20 64 75 70 6c 69 63  ld is not duplic
7bb0: 61 74 65 64 2e 20 20 49 66 0a 2a 2a 20 70 46 72  ated.  If.** pFr
7bc0: 6f 6d 2d 3e 7a 20 69 73 20 75 73 65 64 2c 20 74  om->z is used, t
7bd0: 68 65 6e 20 70 54 6f 2d 3e 7a 20 70 6f 69 6e 74  hen pTo->z point
7be0: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 68  s to the same th
7bf0: 69 6e 67 20 61 73 20 70 46 72 6f 6d 2d 3e 7a 0a  ing as pFrom->z.
7c00: 2a 2a 20 61 6e 64 20 66 6c 61 67 73 20 67 65 74  ** and flags get
7c10: 73 20 73 72 63 54 79 70 65 20 28 65 69 74 68 65  s srcType (eithe
7c20: 72 20 4d 45 4d 5f 45 70 68 65 6d 20 6f 72 20 4d  r MEM_Ephem or M
7c30: 45 4d 5f 53 74 61 74 69 63 29 2e 0a 2a 2f 0a 73  EM_Static)..*/.s
7c40: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
7c50: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 43  NLINE void vdbeC
7c60: 6c 72 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c  lrCopy(Mem *pTo,
7c70: 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f   const Mem *pFro
7c80: 6d 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20  m, int eType){. 
7c90: 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78 74   vdbeMemClearExt
7ca0: 65 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 70 54  ernAndSetNull(pT
7cb0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 56  o);.  assert( !V
7cc0: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 54  dbeMemDynamic(pT
7cd0: 6f 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  o) );.  sqlite3V
7ce0: 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
7cf0: 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 65 54  y(pTo, pFrom, eT
7d00: 79 70 65 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ype);.}.void sql
7d10: 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
7d20: 6f 77 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c  owCopy(Mem *pTo,
7d30: 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f   const Mem *pFro
7d40: 6d 2c 20 69 6e 74 20 73 72 63 54 79 70 65 29 7b  m, int srcType){
7d50: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
7d60: 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
7d70: 65 74 28 70 46 72 6f 6d 29 20 29 3b 0a 20 20 61  et(pFrom) );.  a
7d80: 73 73 65 72 74 28 20 70 54 6f 2d 3e 64 62 3d 3d  ssert( pTo->db==
7d90: 70 46 72 6f 6d 2d 3e 64 62 20 29 3b 0a 20 20 69  pFrom->db );.  i
7da0: 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  f( VdbeMemDynami
7db0: 63 28 70 54 6f 29 20 29 7b 20 76 64 62 65 43 6c  c(pTo) ){ vdbeCl
7dc0: 72 43 6f 70 79 28 70 54 6f 2c 70 46 72 6f 6d 2c  rCopy(pTo,pFrom,
7dd0: 73 72 63 54 79 70 65 29 3b 20 72 65 74 75 72 6e  srcType); return
7de0: 3b 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f  ; }.  memcpy(pTo
7df0: 2c 20 70 46 72 6f 6d 2c 20 4d 45 4d 43 45 4c 4c  , pFrom, MEMCELL
7e00: 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 28 70 46  SIZE);.  if( (pF
7e10: 72 6f 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  rom->flags&MEM_S
7e20: 74 61 74 69 63 29 3d 3d 30 20 29 7b 0a 20 20 20  tatic)==0 ){.   
7e30: 20 70 54 6f 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pTo->flags &= ~
7e40: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 61  (MEM_Dyn|MEM_Sta
7e50: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  tic|MEM_Ephem);.
7e60: 20 20 20 20 61 73 73 65 72 74 28 20 73 72 63 54      assert( srcT
7e70: 79 70 65 3d 3d 4d 45 4d 5f 45 70 68 65 6d 20 7c  ype==MEM_Ephem |
7e80: 7c 20 73 72 63 54 79 70 65 3d 3d 4d 45 4d 5f 53  | srcType==MEM_S
7e90: 74 61 74 69 63 20 29 3b 0a 20 20 20 20 70 54 6f  tatic );.    pTo
7ea0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 72 63 54 79  ->flags |= srcTy
7eb0: 70 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  pe;.  }.}../*.**
7ec0: 20 4d 61 6b 65 20 61 20 66 75 6c 6c 20 63 6f 70   Make a full cop
7ed0: 79 20 6f 66 20 70 46 72 6f 6d 20 69 6e 74 6f 20  y of pFrom into 
7ee0: 70 54 6f 2e 20 20 50 72 69 6f 72 20 63 6f 6e 74  pTo.  Prior cont
7ef0: 65 6e 74 73 20 6f 66 20 70 54 6f 20 61 72 65 0a  ents of pTo are.
7f00: 2a 2a 20 66 72 65 65 64 20 62 65 66 6f 72 65 20  ** freed before 
7f10: 74 68 65 20 63 6f 70 79 20 69 73 20 6d 61 64 65  the copy is made
7f20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7f30: 56 64 62 65 4d 65 6d 43 6f 70 79 28 4d 65 6d 20  VdbeMemCopy(Mem 
7f40: 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pTo, const Mem 
7f50: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
7f60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
7f70: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
7f80: 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
7f90: 74 28 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  t(pFrom) );.  if
7fa0: 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
7fb0: 28 70 54 6f 29 20 29 20 76 64 62 65 4d 65 6d 43  (pTo) ) vdbeMemC
7fc0: 6c 65 61 72 45 78 74 65 72 6e 41 6e 64 53 65 74  learExternAndSet
7fd0: 4e 75 6c 6c 28 70 54 6f 29 3b 0a 20 20 6d 65 6d  Null(pTo);.  mem
7fe0: 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
7ff0: 4d 45 4d 43 45 4c 4c 53 49 5a 45 29 3b 0a 20 20  MEMCELLSIZE);.  
8000: 70 54 6f 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d  pTo->flags &= ~M
8010: 45 4d 5f 44 79 6e 3b 0a 20 20 69 66 28 20 70 54  EM_Dyn;.  if( pT
8020: 6f 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  o->flags&(MEM_St
8030: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20  r|MEM_Blob) ){. 
8040: 20 20 20 69 66 28 20 30 3d 3d 28 70 46 72 6f 6d     if( 0==(pFrom
8050: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61 74  ->flags&MEM_Stat
8060: 69 63 29 20 29 7b 0a 20 20 20 20 20 20 70 54 6f  ic) ){.      pTo
8070: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 45  ->flags |= MEM_E
8080: 70 68 65 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d  phem;.      rc =
8090: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d   sqlite3VdbeMemM
80a0: 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 54 6f  akeWriteable(pTo
80b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
80c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
80d0: 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65  .** Transfer the
80e0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72   contents of pFr
80f0: 6f 6d 20 74 6f 20 70 54 6f 2e 20 41 6e 79 20 65  om to pTo. Any e
8100: 78 69 73 74 69 6e 67 20 76 61 6c 75 65 20 69 6e  xisting value in
8110: 20 70 54 6f 20 69 73 0a 2a 2a 20 66 72 65 65 64   pTo is.** freed
8120: 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
8130: 69 6e 73 20 65 70 68 65 6d 65 72 61 6c 20 64 61  ins ephemeral da
8140: 74 61 2c 20 61 20 63 6f 70 79 20 69 73 20 6d 61  ta, a copy is ma
8150: 64 65 2e 0a 2a 2a 0a 2a 2a 20 70 46 72 6f 6d 20  de..**.** pFrom 
8160: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20  contains an SQL 
8170: 4e 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 72  NULL when this r
8180: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
8190: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
81a0: 64 62 65 4d 65 6d 4d 6f 76 65 28 4d 65 6d 20 2a  dbeMemMove(Mem *
81b0: 70 54 6f 2c 20 4d 65 6d 20 2a 70 46 72 6f 6d 29  pTo, Mem *pFrom)
81c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  {.  assert( pFro
81d0: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  m->db==0 || sqli
81e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
81f0: 46 72 6f 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  From->db->mutex)
8200: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
8210: 6f 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  o->db==0 || sqli
8220: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8230: 54 6f 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  To->db->mutex) )
8240: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ;.  assert( pFro
8250: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 54 6f 2d  m->db==0 || pTo-
8260: 3e 64 62 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  >db==0 || pFrom-
8270: 3e 64 62 3d 3d 70 54 6f 2d 3e 64 62 20 29 3b 0a  >db==pTo->db );.
8280: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
8290: 6d 52 65 6c 65 61 73 65 28 70 54 6f 29 3b 0a 20  mRelease(pTo);. 
82a0: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
82b0: 6f 6d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 29  om, sizeof(Mem))
82c0: 3b 0a 20 20 70 46 72 6f 6d 2d 3e 66 6c 61 67 73  ;.  pFrom->flags
82d0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 70   = MEM_Null;.  p
82e0: 46 72 6f 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  From->szMalloc =
82f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   0;.}../*.** Cha
8300: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
8310: 20 61 20 4d 65 6d 20 74 6f 20 62 65 20 61 20 73   a Mem to be a s
8320: 74 72 69 6e 67 20 6f 72 20 61 20 42 4c 4f 42 2e  tring or a BLOB.
8330: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72  .**.** The memor
8340: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
8350: 61 74 65 67 79 20 64 65 70 65 6e 64 73 20 6f 6e  ategy depends on
8360: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
8370: 65 20 78 44 65 6c 0a 2a 2a 20 70 61 72 61 6d 65  e xDel.** parame
8380: 74 65 72 2e 20 49 66 20 74 68 65 20 76 61 6c 75  ter. If the valu
8390: 65 20 70 61 73 73 65 64 20 69 73 20 53 51 4c 49  e passed is SQLI
83a0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2c 20 74 68  TE_TRANSIENT, th
83b0: 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 72 69 6e  en the .** strin
83c0: 67 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  g is copied into
83d0: 20 61 20 28 70 6f 73 73 69 62 6c 79 20 65 78 69   a (possibly exi
83e0: 73 74 69 6e 67 29 20 62 75 66 66 65 72 20 6d 61  sting) buffer ma
83f0: 6e 61 67 65 64 20 62 79 20 74 68 65 20 0a 2a 2a  naged by the .**
8400: 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e 20   Mem structure. 
8410: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 65  Otherwise, any e
8420: 78 69 73 74 69 6e 67 20 62 75 66 66 65 72 20 69  xisting buffer i
8430: 73 20 66 72 65 65 64 20 61 6e 64 20 74 68 65 0a  s freed and the.
8440: 2a 2a 20 70 6f 69 6e 74 65 72 20 63 6f 70 69 65  ** pointer copie
8450: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
8460: 73 74 72 69 6e 67 20 69 73 20 74 6f 6f 20 6c 61  string is too la
8470: 72 67 65 20 28 69 66 20 69 74 20 65 78 63 65 65  rge (if it excee
8480: 64 73 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ds the SQLITE_LI
8490: 4d 49 54 5f 4c 45 4e 47 54 48 0a 2a 2a 20 73 69  MIT_LENGTH.** si
84a0: 7a 65 20 6c 69 6d 69 74 29 20 74 68 65 6e 20 6e  ze limit) then n
84b0: 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
84c0: 69 6f 6e 20 6f 63 63 75 72 73 2e 20 20 49 66 20  ion occurs.  If 
84d0: 74 68 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62  the string can b
84e0: 65 0a 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68  e.** stored with
84f0: 6f 75 74 20 61 6c 6c 6f 63 61 74 69 6e 67 20 6d  out allocating m
8500: 65 6d 6f 72 79 2c 20 74 68 65 6e 20 69 74 20 69  emory, then it i
8510: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
8520: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69 73  allocation.** is
8530: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
8540: 72 65 20 74 68 65 20 73 74 72 69 6e 67 2c 20 74  re the string, t
8550: 68 65 6e 20 76 61 6c 75 65 20 6f 66 20 70 4d 65  hen value of pMe
8560: 6d 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  m is unchanged. 
8570: 20 49 6e 0a 2a 2a 20 65 69 74 68 65 72 20 63 61   In.** either ca
8580: 73 65 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  se, SQLITE_TOOBI
8590: 47 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  G is returned..*
85a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
85b0: 65 4d 65 6d 53 65 74 53 74 72 28 0a 20 20 4d 65  eMemSetStr(.  Me
85c0: 6d 20 2a 70 4d 65 6d 2c 20 20 20 20 20 20 20 20  m *pMem,        
85d0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
85e0: 20 74 6f 20 73 65 74 20 74 6f 20 73 74 72 69 6e   to set to strin
85f0: 67 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e  g value */.  con
8600: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
8610: 20 2f 2a 20 53 74 72 69 6e 67 20 70 6f 69 6e 74   /* String point
8620: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  er */.  int n,  
8630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
8640: 79 74 65 73 20 69 6e 20 73 74 72 69 6e 67 2c 20  ytes in string, 
8650: 6f 72 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20  or negative */. 
8660: 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20   u8 enc,        
8670: 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67       /* Encoding
8680: 20 6f 66 20 7a 2e 20 20 30 20 66 6f 72 20 42 4c   of z.  0 for BL
8690: 4f 42 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  OBs */.  void (*
86a0: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 2f 2a 20  xDel)(void*) /* 
86b0: 44 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  Destructor funct
86c0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
86d0: 6e 42 79 74 65 20 3d 20 6e 3b 20 20 20 20 20 20  nByte = n;      
86e0: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
86f0: 20 70 4d 65 6d 2d 3e 6e 20 2a 2f 0a 20 20 69 6e   pMem->n */.  in
8700: 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  t iLimit;       
8710: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
8720: 6f 77 65 64 20 73 74 72 69 6e 67 20 6f 72 20 62  owed string or b
8730: 6c 6f 62 20 73 69 7a 65 20 2a 2f 0a 20 20 75 31  lob size */.  u1
8740: 36 20 66 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  6 flags = 0;    
8750: 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66    /* New value f
8760: 6f 72 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 2a  or pMem->flags *
8770: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  /..  assert( pMe
8780: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  m->db==0 || sqli
8790: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
87a0: 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  Mem->db->mutex) 
87b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
87c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f  lite3VdbeMemIsRo
87d0: 77 53 65 74 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  wSet(pMem) );.. 
87e0: 20 2f 2a 20 49 66 20 7a 20 69 73 20 61 20 4e 55   /* If z is a NU
87f0: 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 73 65 74 20  LL pointer, set 
8800: 70 4d 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pMem to contain 
8810: 61 6e 20 53 51 4c 20 4e 55 4c 4c 2e 20 2a 2f 0a  an SQL NULL. */.
8820: 20 20 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20    if( !z ){.    
8830: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
8840: 74 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a 20 20 20  tNull(pMem);.   
8850: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8860: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d  K;.  }..  if( pM
8870: 65 6d 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69 4c  em->db ){.    iL
8880: 69 6d 69 74 20 3d 20 70 4d 65 6d 2d 3e 64 62 2d  imit = pMem->db-
8890: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
88a0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20  IMIT_LENGTH];.  
88b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4c 69 6d 69  }else{.    iLimi
88c0: 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  t = SQLITE_MAX_L
88d0: 45 4e 47 54 48 3b 0a 20 20 7d 0a 20 20 66 6c 61  ENGTH;.  }.  fla
88e0: 67 73 20 3d 20 28 65 6e 63 3d 3d 30 3f 4d 45 4d  gs = (enc==0?MEM
88f0: 5f 42 6c 6f 62 3a 4d 45 4d 5f 53 74 72 29 3b 0a  _Blob:MEM_Str);.
8900: 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
8910: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63  .    assert( enc
8920: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65  !=0 );.    if( e
8930: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
8940: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  ){.      nByte =
8950: 20 30 78 37 66 66 66 66 66 66 66 20 26 20 28 69   0x7fffffff & (i
8960: 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  nt)strlen(z);.  
8970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
8980: 6f 72 28 6e 42 79 74 65 3d 30 3b 20 6e 42 79 74  or(nByte=0; nByt
8990: 65 3c 3d 69 4c 69 6d 69 74 20 26 26 20 28 7a 5b  e<=iLimit && (z[
89a0: 6e 42 79 74 65 5d 20 7c 20 7a 5b 6e 42 79 74 65  nByte] | z[nByte
89b0: 2b 31 5d 29 3b 20 6e 42 79 74 65 2b 3d 32 29 7b  +1]); nByte+=2){
89c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6c 61 67  }.    }.    flag
89d0: 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20  s |= MEM_Term;. 
89e0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
89f0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 65 74  lowing block set
8a00: 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 73  s the new values
8a10: 20 6f 66 20 4d 65 6d 2e 7a 20 61 6e 64 20 4d 65   of Mem.z and Me
8a20: 6d 2e 78 44 65 6c 2e 20 49 74 0a 20 20 2a 2a 20  m.xDel. It.  ** 
8a30: 61 6c 73 6f 20 73 65 74 73 20 61 20 66 6c 61 67  also sets a flag
8a40: 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
8a50: 6c 65 20 22 66 6c 61 67 73 22 20 74 6f 20 69 6e  le "flags" to in
8a60: 64 69 63 61 74 65 20 74 68 65 20 6d 65 6d 6f 72  dicate the memor
8a70: 79 0a 20 20 2a 2a 20 6d 61 6e 61 67 65 6d 65 6e  y.  ** managemen
8a80: 74 20 28 6f 6e 65 20 6f 66 20 4d 45 4d 5f 44 79  t (one of MEM_Dy
8a90: 6e 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69 63 29  n or MEM_Static)
8aa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 78 44 65  ..  */.  if( xDe
8ab0: 6c 3d 3d 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l==SQLITE_TRANSI
8ac0: 45 4e 54 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  ENT ){.    u32 n
8ad0: 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 3b 0a 20  Alloc = nByte;. 
8ae0: 20 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d     if( flags&MEM
8af0: 5f 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 6e  _Term ){.      n
8b00: 41 6c 6c 6f 63 20 2b 3d 20 28 65 6e 63 3d 3d 53  Alloc += (enc==S
8b10: 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32 29 3b  QLITE_UTF8?1:2);
8b20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
8b30: 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  Byte>iLimit ){. 
8b40: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
8b50: 74 65 33 45 72 72 6f 72 54 6f 50 61 72 73 65 72  te3ErrorToParser
8b60: 28 70 4d 65 6d 2d 3e 64 62 2c 20 53 51 4c 49 54  (pMem->db, SQLIT
8b70: 45 5f 54 4f 4f 42 49 47 29 3b 0a 20 20 20 20 7d  E_TOOBIG);.    }
8b80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
8b90: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20  Alloc==0 );.    
8ba0: 74 65 73 74 63 61 73 65 28 20 6e 41 6c 6c 6f 63  testcase( nAlloc
8bb0: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 74 65 73 74  ==31 );.    test
8bc0: 63 61 73 65 28 20 6e 41 6c 6c 6f 63 3d 3d 33 32  case( nAlloc==32
8bd0: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
8be0: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
8bf0: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 28  ndResize(pMem, (
8c00: 69 6e 74 29 4d 41 58 28 6e 41 6c 6c 6f 63 2c 33  int)MAX(nAlloc,3
8c10: 32 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  2)) ){.      ret
8c20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8c30: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
8c40: 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c   memcpy(pMem->z,
8c50: 20 7a 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 7d   z, nAlloc);.  }
8c60: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
8c70: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8c80: 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  pMem);.    pMem-
8c90: 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 7a 3b 0a  >z = (char *)z;.
8ca0: 20 20 20 20 69 66 28 20 78 44 65 6c 3d 3d 53 51      if( xDel==SQ
8cb0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  LITE_DYNAMIC ){.
8cc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c        pMem->zMal
8cd0: 6c 6f 63 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  loc = pMem->z;. 
8ce0: 20 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c       pMem->szMal
8cf0: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
8d00: 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e  allocSize(pMem->
8d10: 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  db, pMem->zMallo
8d20: 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c);.    }else{. 
8d30: 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20       pMem->xDel 
8d40: 3d 20 78 44 65 6c 3b 0a 20 20 20 20 20 20 66 6c  = xDel;.      fl
8d50: 61 67 73 20 7c 3d 20 28 28 78 44 65 6c 3d 3d 53  ags |= ((xDel==S
8d60: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3f 4d 45  QLITE_STATIC)?ME
8d70: 4d 5f 53 74 61 74 69 63 3a 4d 45 4d 5f 44 79 6e  M_Static:MEM_Dyn
8d80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8d90: 70 4d 65 6d 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b  pMem->n = nByte;
8da0: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  .  pMem->flags =
8db0: 20 66 6c 61 67 73 3b 0a 20 20 70 4d 65 6d 2d 3e   flags;.  pMem->
8dc0: 65 6e 63 20 3d 20 28 65 6e 63 3d 3d 30 20 3f 20  enc = (enc==0 ? 
8dd0: 53 51 4c 49 54 45 5f 55 54 46 38 20 3a 20 65 6e  SQLITE_UTF8 : en
8de0: 63 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  c);..#ifndef SQL
8df0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
8e00: 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d   if( pMem->enc!=
8e10: 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 73  SQLITE_UTF8 && s
8e20: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 48 61 6e  qlite3VdbeMemHan
8e30: 64 6c 65 42 6f 6d 28 70 4d 65 6d 29 20 29 7b 0a  dleBom(pMem) ){.
8e40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8e50: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
8e60: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
8e70: 6e 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 7b 0a  nByte>iLimit ){.
8e80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8e90: 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 7d 0a 0a 20  E_TOOBIG;.  }.. 
8ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8eb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  K;.}../*.** Move
8ec0: 20 64 61 74 61 20 6f 75 74 20 6f 66 20 61 20 62   data out of a b
8ed0: 74 72 65 65 20 6b 65 79 20 6f 72 20 64 61 74 61  tree key or data
8ee0: 20 66 69 65 6c 64 20 61 6e 64 20 69 6e 74 6f 20   field and into 
8ef0: 61 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e  a Mem structure.
8f00: 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 69 73 20  .** The data is 
8f10: 70 61 79 6c 6f 61 64 20 66 72 6f 6d 20 74 68 65  payload from the
8f20: 20 65 6e 74 72 79 20 74 68 61 74 20 70 43 75 72   entry that pCur
8f30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
8f40: 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 2e 20 20 6f  inting.** to.  o
8f50: 66 66 73 65 74 20 61 6e 64 20 61 6d 74 20 64 65  ffset and amt de
8f60: 74 65 72 6d 69 6e 65 20 77 68 61 74 20 70 6f 72  termine what por
8f70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
8f80: 20 6f 72 20 6b 65 79 20 74 6f 20 72 65 74 72 69   or key to retri
8f90: 65 76 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  eve..** The resu
8fa0: 6c 74 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  lt is written in
8fb0: 74 6f 20 74 68 65 20 70 4d 65 6d 20 65 6c 65 6d  to the pMem elem
8fc0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ent..**.** The p
8fd0: 4d 65 6d 20 6f 62 6a 65 63 74 20 6d 75 73 74 20  Mem object must 
8fe0: 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61  have been initia
8ff0: 6c 69 7a 65 64 2e 20 20 54 68 69 73 20 72 6f 75  lized.  This rou
9000: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 0a 2a 2a  tine will use.**
9010: 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 74   pMem->zMalloc t
9020: 6f 20 68 6f 6c 64 20 74 68 65 20 63 6f 6e 74 65  o hold the conte
9030: 6e 74 20 66 72 6f 6d 20 74 68 65 20 62 74 72 65  nt from the btre
9040: 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
9050: 20 4e 65 77 0a 2a 2a 20 70 4d 65 6d 2d 3e 7a 4d   New.** pMem->zM
9060: 61 6c 6c 6f 63 20 73 70 61 63 65 20 77 69 6c 6c  alloc space will
9070: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 66   be allocated if
9080: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
9090: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
90a0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
90b0: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
90c0: 72 65 20 74 68 61 74 20 74 68 65 20 70 4d 65 6d  re that the pMem
90d0: 20 6f 62 6a 65 63 74 20 69 73 20 65 76 65 6e 74   object is event
90e0: 75 61 6c 6c 79 0a 2a 2a 20 64 65 73 74 72 6f 79  ually.** destroy
90f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
9100: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
9110: 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 20 28  for any reason (
9120: 6d 61 6c 6c 6f 63 20 72 65 74 75 72 6e 73 20 4e  malloc returns N
9130: 55 4c 4c 20 6f 72 20 75 6e 61 62 6c 65 0a 2a 2a  ULL or unable.**
9140: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68   to read from th
9150: 65 20 64 69 73 6b 29 20 74 68 65 6e 20 74 68 65  e disk) then the
9160: 20 70 4d 65 6d 20 69 73 20 6c 65 66 74 20 69 6e   pMem is left in
9170: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
9180: 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69   state..*/.stati
9190: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
91a0: 45 20 69 6e 74 20 76 64 62 65 4d 65 6d 46 72 6f  E int vdbeMemFro
91b0: 6d 42 74 72 65 65 52 65 73 69 7a 65 28 0a 20 20  mBtreeResize(.  
91c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
91d0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
91e0: 74 69 6e 67 20 61 74 20 72 65 63 6f 72 64 20 74  ting at record t
91f0: 6f 20 72 65 74 72 69 65 76 65 2e 20 2a 2f 0a 20  o retrieve. */. 
9200: 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
9210: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
9220: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64  m the start of d
9230: 61 74 61 20 74 6f 20 72 65 74 75 72 6e 20 62 79  ata to return by
9240: 74 65 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 75  tes from. */.  u
9250: 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
9260: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9270: 74 65 73 20 74 6f 20 72 65 74 75 72 6e 2e 20 2a  tes to return. *
9280: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
9290: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
92a0: 74 75 72 6e 20 64 61 74 61 20 69 6e 20 74 68 69  turn data in thi
92b0: 73 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e  s Mem structure.
92c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
92d0: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  .  pMem->flags =
92e0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28   MEM_Null;.  if(
92f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
9300: 52 65 63 6f 72 64 53 69 7a 65 28 70 43 75 72 29  RecordSize(pCur)
9310: 3c 6f 66 66 73 65 74 2b 61 6d 74 20 29 7b 0a 20  <offset+amt ){. 
9320: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9330: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9340: 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
9350: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
9360: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
9370: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 61 6d 74  Resize(pMem, amt
9380: 2b 31 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  +1)) ){.    rc =
9390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
93a0: 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
93b0: 74 2c 20 61 6d 74 2c 20 70 4d 65 6d 2d 3e 7a 29  t, amt, pMem->z)
93c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
93d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
93e0: 20 70 4d 65 6d 2d 3e 7a 5b 61 6d 74 5d 20 3d 20   pMem->z[amt] = 
93f0: 30 3b 20 20 20 2f 2a 20 4f 76 65 72 72 75 6e 20  0;   /* Overrun 
9400: 61 72 65 61 20 75 73 65 64 20 77 68 65 6e 20 72  area used when r
9410: 65 61 64 69 6e 67 20 6d 61 6c 66 6f 72 6d 65 64  eading malformed
9420: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   records */.    
9430: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9440: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
9450: 70 4d 65 6d 2d 3e 6e 20 3d 20 28 69 6e 74 29 61  pMem->n = (int)a
9460: 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  mt;.    }else{. 
9470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9480: 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
9490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
94a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
94b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
94c0: 6d 42 74 72 65 65 28 0a 20 20 42 74 43 75 72 73  mBtree(.  BtCurs
94d0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 2f 2a 20 43  or *pCur,   /* C
94e0: 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61  ursor pointing a
94f0: 74 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 72  t record to retr
9500: 69 65 76 65 2e 20 2a 2f 0a 20 20 75 33 32 20 6f  ieve. */.  u32 o
9510: 66 66 73 65 74 2c 20 20 20 20 20 20 20 2f 2a 20  ffset,       /* 
9520: 4f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20  Offset from the 
9530: 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 74 6f  start of data to
9540: 20 72 65 74 75 72 6e 20 62 79 74 65 73 20 66 72   return bytes fr
9550: 6f 6d 2e 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  om. */.  u32 amt
9560: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
9570: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
9580: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 4d 65   return. */.  Me
9590: 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
95a0: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 64  /* OUT: Return d
95b0: 61 74 61 20 69 6e 20 74 68 69 73 20 4d 65 6d 20  ata in this Mem 
95c0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 29 7b  structure. */.){
95d0: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 20  .  char *zData; 
95e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
95f0: 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 6c 61  rom the btree la
9600: 79 65 72 20 2a 2f 0a 20 20 75 33 32 20 61 76 61  yer */.  u32 ava
9610: 69 6c 61 62 6c 65 20 3d 20 30 3b 20 20 2f 2a 20  ilable = 0;  /* 
9620: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9630: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
9640: 20 6c 6f 63 61 6c 20 62 74 72 65 65 20 70 61 67   local btree pag
9650: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
9660: 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 52 65  SQLITE_OK; /* Re
9670: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
9680: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
9690: 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
96a0: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
96b0: 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44 79 6e  ert( !VdbeMemDyn
96c0: 61 6d 69 63 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  amic(pMem) );.. 
96d0: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 65 20 63 61   /* Note: the ca
96e0: 6c 6c 73 20 74 6f 20 42 74 72 65 65 4b 65 79 46  lls to BtreeKeyF
96f0: 65 74 63 68 28 29 20 61 6e 64 20 44 61 74 61 46  etch() and DataF
9700: 65 74 63 68 28 29 20 62 65 6c 6f 77 20 61 73 73  etch() below ass
9710: 65 72 74 28 29 20 0a 20 20 2a 2a 20 74 68 61 74  ert() .  ** that
9720: 20 62 6f 74 68 20 74 68 65 20 42 74 53 68 61 72   both the BtShar
9730: 65 64 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  ed and database 
9740: 68 61 6e 64 6c 65 20 6d 75 74 65 78 65 73 20 61  handle mutexes a
9750: 72 65 20 68 65 6c 64 2e 20 2a 2f 0a 20 20 61 73  re held. */.  as
9760: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 56 64  sert( !sqlite3Vd
9770: 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d  beMemIsRowSet(pM
9780: 65 6d 29 20 29 3b 0a 20 20 7a 44 61 74 61 20 3d  em) );.  zData =
9790: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
97a0: 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63  BtreePayloadFetc
97b0: 68 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62  h(pCur, &availab
97c0: 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  le);.  assert( z
97d0: 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 69 66  Data!=0 );..  if
97e0: 28 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 61 76  ( offset+amt<=av
97f0: 61 69 6c 61 62 6c 65 20 29 7b 0a 20 20 20 20 70  ailable ){.    p
9800: 4d 65 6d 2d 3e 7a 20 3d 20 26 7a 44 61 74 61 5b  Mem->z = &zData[
9810: 6f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 4d 65  offset];.    pMe
9820: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
9830: 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  lob|MEM_Ephem;. 
9840: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 69 6e     pMem->n = (in
9850: 74 29 61 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)amt;.  }else{.
9860: 20 20 20 20 72 63 20 3d 20 76 64 62 65 4d 65 6d      rc = vdbeMem
9870: 46 72 6f 6d 42 74 72 65 65 52 65 73 69 7a 65 28  FromBtreeResize(
9880: 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
9890: 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 7d 0a 0a 20  t, pMem);.  }.. 
98a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
98b0: 2a 0a 2a 2a 20 54 68 65 20 70 56 61 6c 20 61 72  *.** The pVal ar
98c0: 67 75 6d 65 6e 74 20 69 73 20 6b 6e 6f 77 6e 20  gument is known 
98d0: 74 6f 20 62 65 20 61 20 76 61 6c 75 65 20 6f 74  to be a value ot
98e0: 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2e 0a 2a  her than NULL..*
98f0: 2a 20 43 6f 6e 76 65 72 74 20 69 74 20 69 6e 74  * Convert it int
9900: 6f 20 61 20 73 74 72 69 6e 67 20 77 69 74 68 20  o a string with 
9910: 65 6e 63 6f 64 69 6e 67 20 65 6e 63 20 61 6e 64  encoding enc and
9920: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
9930: 72 0a 2a 2a 20 74 6f 20 61 20 7a 65 72 6f 2d 74  r.** to a zero-t
9940: 65 72 6d 69 6e 61 74 65 64 20 76 65 72 73 69 6f  erminated versio
9950: 6e 20 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67  n of that string
9960: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
9970: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 63 6f 6e 73  TE_NOINLINE cons
9980: 74 20 76 6f 69 64 20 2a 76 61 6c 75 65 54 6f 54  t void *valueToT
9990: 65 78 74 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ext(sqlite3_valu
99a0: 65 2a 20 70 56 61 6c 2c 20 75 38 20 65 6e 63 29  e* pVal, u8 enc)
99b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 56 61 6c  {.  assert( pVal
99c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
99d0: 20 70 56 61 6c 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pVal->db==0 || 
99e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
99f0: 6c 64 28 70 56 61 6c 2d 3e 64 62 2d 3e 6d 75 74  ld(pVal->db->mut
9a00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9a10: 20 28 65 6e 63 26 33 29 3d 3d 28 65 6e 63 26 7e   (enc&3)==(enc&~
9a20: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
9a30: 47 4e 45 44 29 20 29 3b 0a 20 20 61 73 73 65 72  GNED) );.  asser
9a40: 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d  t( !sqlite3VdbeM
9a50: 65 6d 49 73 52 6f 77 53 65 74 28 70 56 61 6c 29  emIsRowSet(pVal)
9a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
9a70: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Val->flags & (ME
9a80: 4d 5f 4e 75 6c 6c 29 29 3d 3d 30 20 29 3b 0a 20  M_Null))==0 );. 
9a90: 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73   if( pVal->flags
9aa0: 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d   & (MEM_Blob|MEM
9ab0: 5f 53 74 72 29 20 29 7b 0a 20 20 20 20 69 66 28  _Str) ){.    if(
9ac0: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 56 61 6c   ExpandBlob(pVal
9ad0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
9ae0: 20 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 7c 3d    pVal->flags |=
9af0: 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 69 66   MEM_Str;.    if
9b00: 28 20 70 56 61 6c 2d 3e 65 6e 63 20 21 3d 20 28  ( pVal->enc != (
9b10: 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
9b20: 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 29 7b 0a  F16_ALIGNED) ){.
9b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9b40: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
9b50: 70 56 61 6c 2c 20 65 6e 63 20 26 20 7e 53 51 4c  pVal, enc & ~SQL
9b60: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
9b70: 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  D);.    }.    if
9b80: 28 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  ( (enc & SQLITE_
9b90: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 21 3d  UTF16_ALIGNED)!=
9ba0: 30 20 26 26 20 31 3d 3d 28 31 26 53 51 4c 49 54  0 && 1==(1&SQLIT
9bb0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 61  E_PTR_TO_INT(pVa
9bc0: 6c 2d 3e 7a 29 29 20 29 7b 0a 20 20 20 20 20 20  l->z)) ){.      
9bd0: 61 73 73 65 72 74 28 20 28 70 56 61 6c 2d 3e 66  assert( (pVal->f
9be0: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 45 70 68 65  lags & (MEM_Ephe
9bf0: 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29 29 21 3d  m|MEM_Static))!=
9c00: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
9c10: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b  qlite3VdbeMemMak
9c20: 65 57 72 69 74 65 61 62 6c 65 28 70 56 61 6c 29  eWriteable(pVal)
9c30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9c40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
9c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9c70: 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 70 56  mNulTerminate(pV
9c80: 61 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  al); /* IMP: R-3
9c90: 31 32 37 35 2d 34 34 30 36 30 20 2a 2f 0a 20 20  1275-44060 */.  
9ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9cb0: 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69  e3VdbeMemStringi
9cc0: 66 79 28 70 56 61 6c 2c 20 65 6e 63 2c 20 30 29  fy(pVal, enc, 0)
9cd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  ;.    assert( 0=
9ce0: 3d 28 31 26 53 51 4c 49 54 45 5f 50 54 52 5f 54  =(1&SQLITE_PTR_T
9cf0: 4f 5f 49 4e 54 28 70 56 61 6c 2d 3e 7a 29 29 20  O_INT(pVal->z)) 
9d00: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9d10: 70 56 61 6c 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20  pVal->enc==(enc 
9d20: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
9d30: 41 4c 49 47 4e 45 44 29 20 7c 7c 20 70 56 61 6c  ALIGNED) || pVal
9d40: 2d 3e 64 62 3d 3d 30 0a 20 20 20 20 20 20 20 20  ->db==0.        
9d50: 20 20 20 20 20 20 7c 7c 20 70 56 61 6c 2d 3e 64        || pVal->d
9d60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9d70: 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 2d 3e 65  );.  if( pVal->e
9d80: 6e 63 3d 3d 28 65 6e 63 20 26 20 7e 53 51 4c 49  nc==(enc & ~SQLI
9d90: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
9da0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
9db0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 56   sqlite3VdbeMemV
9dc0: 61 6c 69 64 53 74 72 52 65 70 28 70 56 61 6c 29  alidStrRep(pVal)
9dd0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   );.    return p
9de0: 56 61 6c 2d 3e 7a 3b 0a 20 20 7d 65 6c 73 65 7b  Val->z;.  }else{
9df0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9e00: 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 66 75   }.}../* This fu
9e10: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 61  nction is only a
9e20: 76 61 69 6c 61 62 6c 65 20 69 6e 74 65 72 6e 61  vailable interna
9e30: 6c 6c 79 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  lly, it is not p
9e40: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  art of the.** ex
9e50: 74 65 72 6e 61 6c 20 41 50 49 2e 20 49 74 20 77  ternal API. It w
9e60: 6f 72 6b 73 20 69 6e 20 61 20 73 69 6d 69 6c 61  orks in a simila
9e70: 72 20 77 61 79 20 74 6f 20 73 71 6c 69 74 65 33  r way to sqlite3
9e80: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 2c 0a 2a  _value_text(),.*
9e90: 2a 20 65 78 63 65 70 74 20 74 68 65 20 64 61 74  * except the dat
9ea0: 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 69 6e  a returned is in
9eb0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 73 70   the encoding sp
9ec0: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ecified by the s
9ed0: 65 63 6f 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  econd.** paramet
9ee0: 65 72 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  er, which must b
9ef0: 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
9f00: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
9f10: 55 54 46 31 36 4c 45 20 6f 72 0a 2a 2a 20 53 51  UTF16LE or.** SQ
9f20: 4c 49 54 45 5f 55 54 46 38 2e 0a 2a 2a 0a 2a 2a  LITE_UTF8..**.**
9f30: 20 28 32 30 30 36 2d 30 32 2d 31 36 3a 29 20 20   (2006-02-16:)  
9f40: 54 68 65 20 65 6e 63 20 76 61 6c 75 65 20 63 61  The enc value ca
9f50: 6e 20 62 65 20 6f 72 2d 65 64 20 77 69 74 68 20  n be or-ed with 
9f60: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
9f70: 47 4e 45 44 2e 0a 2a 2a 20 49 66 20 74 68 61 74  GNED..** If that
9f80: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
9f90: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
9fa0: 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
9fb0: 20 61 6e 20 65 76 65 6e 20 62 79 74 65 0a 2a 2a   an even byte.**
9fc0: 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 63 6f   boundary..*/.co
9fd0: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
9fe0: 33 56 61 6c 75 65 54 65 78 74 28 73 71 6c 69 74  3ValueText(sqlit
9ff0: 65 33 5f 76 61 6c 75 65 2a 20 70 56 61 6c 2c 20  e3_value* pVal, 
a000: 75 38 20 65 6e 63 29 7b 0a 20 20 69 66 28 20 21  u8 enc){.  if( !
a010: 70 56 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  pVal ) return 0;
a020: 0a 20 20 61 73 73 65 72 74 28 20 70 56 61 6c 2d  .  assert( pVal-
a030: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
a040: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 56 61  3_mutex_held(pVa
a050: 6c 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  l->db->mutex) );
a060: 0a 20 20 61 73 73 65 72 74 28 20 28 65 6e 63 26  .  assert( (enc&
a070: 33 29 3d 3d 28 65 6e 63 26 7e 53 51 4c 49 54 45  3)==(enc&~SQLITE
a080: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20  _UTF16_ALIGNED) 
a090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
a0a0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f  lite3VdbeMemIsRo
a0b0: 77 53 65 74 28 70 56 61 6c 29 20 29 3b 0a 20 20  wSet(pVal) );.  
a0c0: 69 66 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73  if( (pVal->flags
a0d0: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  &(MEM_Str|MEM_Te
a0e0: 72 6d 29 29 3d 3d 28 4d 45 4d 5f 53 74 72 7c 4d  rm))==(MEM_Str|M
a0f0: 45 4d 5f 54 65 72 6d 29 20 26 26 20 70 56 61 6c  EM_Term) && pVal
a100: 2d 3e 65 6e 63 3d 3d 65 6e 63 20 29 7b 0a 20 20  ->enc==enc ){.  
a110: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a120: 33 56 64 62 65 4d 65 6d 56 61 6c 69 64 53 74 72  3VdbeMemValidStr
a130: 52 65 70 28 70 56 61 6c 29 20 29 3b 0a 20 20 20  Rep(pVal) );.   
a140: 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 7a 3b   return pVal->z;
a150: 0a 20 20 7d 0a 20 20 69 66 28 20 70 56 61 6c 2d  .  }.  if( pVal-
a160: 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  >flags&MEM_Null 
a170: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 61  .  }.  return va
a190: 6c 75 65 54 6f 54 65 78 74 28 70 56 61 6c 2c 20  lueToText(pVal, 
a1a0: 65 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  enc);.}../*.** C
a1b0: 72 65 61 74 65 20 61 20 6e 65 77 20 73 71 6c 69  reate a new sqli
a1c0: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
a1d0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
a1e0: 75 65 20 2a 73 71 6c 69 74 65 33 56 61 6c 75 65  ue *sqlite3Value
a1f0: 4e 65 77 28 73 71 6c 69 74 65 33 20 2a 64 62 29  New(sqlite3 *db)
a200: 7b 0a 20 20 4d 65 6d 20 2a 70 20 3d 20 73 71 6c  {.  Mem *p = sql
a210: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a220: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  (db, sizeof(*p))
a230: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
a240: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
a250: 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 64 62 20  Null;.    p->db 
a260: 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = db;.  }.  retu
a270: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
a280: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61  ontext object pa
a290: 73 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  ssed by sqlite3S
a2a0: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
a2b0: 65 28 29 20 74 68 72 6f 75 67 68 20 74 6f 20 0a  e() through to .
a2c0: 2a 2a 20 76 61 6c 75 65 4e 65 77 28 29 2e 20 53  ** valueNew(). S
a2d0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
a2e0: 65 20 76 61 6c 75 65 4e 65 77 28 29 20 66 6f 72  e valueNew() for
a2f0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72   details..*/.str
a300: 75 63 74 20 56 61 6c 75 65 4e 65 77 53 74 61 74  uct ValueNewStat
a310: 34 43 74 78 20 7b 0a 20 20 50 61 72 73 65 20 2a  4Ctx {.  Parse *
a320: 70 50 61 72 73 65 3b 0a 20 20 49 6e 64 65 78 20  pParse;.  Index 
a330: 2a 70 49 64 78 3b 0a 20 20 55 6e 70 61 63 6b 65  *pIdx;.  Unpacke
a340: 64 52 65 63 6f 72 64 20 2a 2a 70 70 52 65 63 3b  dRecord **ppRec;
a350: 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 7d 3b 0a  .  int iVal;.};.
a360: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
a370: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
a380: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 73 71  nter to a new sq
a390: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
a3a0: 63 74 2e 20 49 66 0a 2a 2a 20 74 68 65 20 73 65  ct. If.** the se
a3b0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
a3c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a3d0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 6f 62 6a 65  s NULL, the obje
a3e0: 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ct is allocated.
a3f0: 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ** by calling sq
a400: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 2e  lite3ValueNew().
a410: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
a420: 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
a430: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
a440: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
a450: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
a460: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 69 6e 64  being called ind
a470: 69 72 65 63 74 6c 79 20 62 79 20 73 71 6c 69 74  irectly by sqlit
a480: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
a490: 61 6c 75 65 28 29 2e 20 49 66 20 69 74 20 68 61  alue(). If it ha
a4a0: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
a4b0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
a4c0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 55 6e   allocate the Un
a4d0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
a4e0: 75 63 74 75 72 65 20 74 68 61 74 20 0a 2a 2a 20  ucture that .** 
a4f0: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 69  that function wi
a500: 6c 6c 20 72 65 74 75 72 6e 20 74 6f 20 69 74 73  ll return to its
a510: 20 63 61 6c 6c 65 72 20 68 65 72 65 2e 20 54 68   caller here. Th
a520: 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
a530: 74 65 72 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  ter to.** an sql
a540: 69 74 65 33 5f 76 61 6c 75 65 20 77 69 74 68 69  ite3_value withi
a550: 6e 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65  n the UnpackedRe
a560: 63 6f 72 64 2e 61 5b 5d 20 61 72 72 61 79 2e 0a  cord.a[] array..
a570: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
a580: 33 5f 76 61 6c 75 65 20 2a 76 61 6c 75 65 4e 65  3_value *valueNe
a590: 77 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  w(sqlite3 *db, s
a5a0: 74 72 75 63 74 20 56 61 6c 75 65 4e 65 77 53 74  truct ValueNewSt
a5b0: 61 74 34 43 74 78 20 2a 70 29 7b 0a 23 69 66 64  at4Ctx *p){.#ifd
a5c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a5d0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
a5e0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 55    if( p ){.    U
a5f0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
a600: 52 65 63 20 3d 20 70 2d 3e 70 70 52 65 63 5b 30  Rec = p->ppRec[0
a610: 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 52 65 63  ];..    if( pRec
a620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  ==0 ){.      Ind
a630: 65 78 20 2a 70 49 64 78 20 3d 20 70 2d 3e 70 49  ex *pIdx = p->pI
a640: 64 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  dx;      /* Inde
a650: 78 20 62 65 69 6e 67 20 70 72 6f 62 65 64 20 2a  x being probed *
a660: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
a670: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a680: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
a690: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
a6a0: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  e */.      int i
a6b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a6c0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
a6d0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
a6e0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70      int nCol = p
a6f0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 20 20  Idx->nColumn;   
a700: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
a710: 65 78 20 63 6f 6c 75 6d 6e 73 20 69 6e 63 6c 75  ex columns inclu
a720: 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
a730: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73  .      nByte = s
a740: 69 7a 65 6f 66 28 4d 65 6d 29 20 2a 20 6e 43 6f  izeof(Mem) * nCo
a750: 6c 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  l + ROUND8(sizeo
a760: 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
a770: 29 29 3b 0a 20 20 20 20 20 20 70 52 65 63 20 3d  ));.      pRec =
a780: 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
a790: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
a7a0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
a7b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63  ;.      if( pRec
a7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63   ){.        pRec
a7d0: 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c  ->pKeyInfo = sql
a7e0: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
a7f0: 65 78 28 70 2d 3e 70 50 61 72 73 65 2c 20 70 49  ex(p->pParse, pI
a800: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
a810: 20 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 20   pRec->pKeyInfo 
a820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
a830: 65 72 74 28 20 70 52 65 63 2d 3e 70 4b 65 79 49  ert( pRec->pKeyI
a840: 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3d 3d  nfo->nAllField==
a850: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
a860: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
a870: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45  pKeyInfo->enc==E
a880: 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 20 20  NC(db) );.      
a890: 20 20 20 20 70 52 65 63 2d 3e 61 4d 65 6d 20 3d      pRec->aMem =
a8a0: 20 28 4d 65 6d 20 2a 29 28 28 75 38 2a 29 70 52   (Mem *)((u8*)pR
a8b0: 65 63 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ec + ROUND8(size
a8c0: 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
a8d0: 64 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d)));.          
a8e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
a8f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a900: 20 20 20 70 52 65 63 2d 3e 61 4d 65 6d 5b 69 5d     pRec->aMem[i]
a910: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
a920: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
a930: 52 65 63 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 20  Rec->aMem[i].db 
a940: 3d 20 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  = db;.          
a950: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
a960: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a970: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
a980: 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Rec);.          
a990: 70 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRec = 0;.      
a9a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a9b0: 20 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 20    if( pRec==0 ) 
a9c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
a9d0: 70 2d 3e 70 70 52 65 63 5b 30 5d 20 3d 20 70 52  p->ppRec[0] = pR
a9e0: 65 63 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ec;.    }.  .   
a9f0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
aa00: 70 2d 3e 69 56 61 6c 2b 31 3b 0a 20 20 20 20 72  p->iVal+1;.    r
aa10: 65 74 75 72 6e 20 26 70 52 65 63 2d 3e 61 4d 65  eturn &pRec->aMe
aa20: 6d 5b 70 2d 3e 69 56 61 6c 5d 3b 0a 20 20 7d 0a  m[p->iVal];.  }.
aa30: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
aa40: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
aa50: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
aa60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
aa70: 54 33 5f 4f 52 5f 53 54 41 54 34 29 20 2a 2f 0a  T3_OR_STAT4) */.
aa80: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
aa90: 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 7d 0a  ValueNew(db);.}.
aaa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
aab0: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 64  ssion object ind
aac0: 69 63 61 74 65 64 20 62 79 20 74 68 65 20 73 65  icated by the se
aad0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
aae0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
aaf0: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 51  o be a scalar SQ
ab00: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  L function. If.*
ab10: 2a 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 66 75 6e  *.**   * all fun
ab20: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
ab30: 61 72 65 20 53 51 4c 20 6c 69 74 65 72 61 6c 73  are SQL literals
ab40: 2c 0a 2a 2a 20 20 20 2a 20 6f 6e 65 20 6f 66 20  ,.**   * one of 
ab50: 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  the SQLITE_FUNC_
ab60: 43 4f 4e 53 54 41 4e 54 20 6f 72 20 5f 53 4c 4f  CONSTANT or _SLO
ab70: 43 48 4e 47 20 66 75 6e 63 74 69 6f 6e 20 66 6c  CHNG function fl
ab80: 61 67 73 20 69 73 20 73 65 74 2c 20 61 6e 64 0a  ags is set, and.
ab90: 2a 2a 20 20 20 2a 20 74 68 65 20 53 51 4c 49 54  **   * the SQLIT
aba0: 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
abb0: 66 75 6e 63 74 69 6f 6e 20 66 6c 61 67 20 69 73  function flag is
abc0: 20 6e 6f 74 20 73 65 74 2c 0a 2a 2a 0a 2a 2a 20   not set,.**.** 
abd0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
abe0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 69 6e  e attempts to in
abf0: 76 6f 6b 65 20 74 68 65 20 53 51 4c 20 66 75 6e  voke the SQL fun
ac00: 63 74 69 6f 6e 2e 20 41 73 73 75 6d 69 6e 67 20  ction. Assuming 
ac10: 6e 6f 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  no.** error occu
ac20: 72 73 2c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  rs, output param
ac30: 65 74 65 72 20 28 2a 70 70 56 61 6c 29 20 69 73  eter (*ppVal) is
ac40: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
ac50: 20 61 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 62 6a   a value .** obj
ac60: 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ect containing t
ac70: 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65  he result before
ac80: 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
ac90: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 41 66 66 69  E_OK..**.** Affi
aca0: 6e 69 74 79 20 61 66 66 20 69 73 20 61 70 70 6c  nity aff is appl
acb0: 69 65 64 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ied to the resul
acc0: 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
acd0: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
ace0: 6e 67 2e 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ng..** If the re
acf0: 73 75 6c 74 20 69 73 20 61 20 74 65 78 74 20 76  sult is a text v
ad00: 61 6c 75 65 2c 20 74 68 65 20 73 71 6c 69 74 65  alue, the sqlite
ad10: 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 75  3_value object u
ad20: 73 65 73 20 65 6e 63 6f 64 69 6e 67 20 0a 2a 2a  ses encoding .**
ad30: 20 65 6e 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   enc..**.** If t
ad40: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
ad50: 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
ad60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
ad70: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
ad80: 0a 2a 2a 20 61 6e 64 20 73 65 74 73 20 28 2a 70  .** and sets (*p
ad90: 70 56 61 6c 29 20 74 6f 20 4e 55 4c 4c 2e 20 4f  pVal) to NULL. O
ada0: 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  r, if an error o
adb0: 63 63 75 72 73 2c 20 28 2a 70 70 56 61 6c 29 20  ccurs, (*ppVal) 
adc0: 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c  is set to.** NUL
add0: 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20  L and an SQLite 
ade0: 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
adf0: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ned..*/.#ifdef S
ae00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
ae10: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74  T3_OR_STAT4.stat
ae20: 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d  ic int valueFrom
ae30: 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
ae40: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ae60: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
ae70: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
ae80: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aea0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
aeb0: 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20 75   evaluate */.  u
aec0: 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20  8 enc,          
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aee0: 2a 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73  * Encoding to us
aef0: 65 20 2a 2f 0a 20 20 75 38 20 61 66 66 2c 20 20  e */.  u8 aff,  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
af20: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73  ty to use */.  s
af30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
af40: 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  pVal,          /
af50: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
af60: 76 61 6c 75 65 20 68 65 72 65 20 2a 2f 0a 20 20  value here */.  
af70: 73 74 72 75 63 74 20 56 61 6c 75 65 4e 65 77 53  struct ValueNewS
af80: 74 61 74 34 43 74 78 20 2a 70 43 74 78 20 20 20  tat4Ctx *pCtx   
af90: 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67 75 6d 65  /* Second argume
afa0: 6e 74 20 66 6f 72 20 76 61 6c 75 65 4e 65 77 28  nt for valueNew(
afb0: 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ) */.){.  sqlite
afc0: 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 20 20  3_context ctx;  
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
afe0: 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  text object for 
aff0: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74  function invocat
b000: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
b010: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 3d  _value **apVal =
b020: 20 30 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63   0;      /* Func
b030: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
b040: 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 30  /.  int nVal = 0
b050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b060: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
b070: 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  pVal[] array */.
b080: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
b090: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b0a0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 64 65    /* Function de
b0b0: 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  finition */.  sq
b0c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
b0d0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
b0e0: 20 4e 65 77 20 76 61 6c 75 65 20 2a 2f 0a 20 20   New value */.  
b0f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b100: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
b110: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
b120: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
b130: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ist = 0;        
b140: 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
b150: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
b160: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b180: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
b190: 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ble */..  assert
b1a0: 28 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20 61  ( pCtx!=0 );.  a
b1b0: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
b1c0: 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
b1d0: 3d 3d 30 20 29 3b 0a 20 20 70 4c 69 73 74 20 3d  ==0 );.  pList =
b1e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69   p->x.pList;.  i
b1f0: 66 28 20 70 4c 69 73 74 20 29 20 6e 56 61 6c 20  f( pList ) nVal 
b200: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
b210: 20 20 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    pFunc = sqlite
b220: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
b230: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
b240: 56 61 6c 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  Val, enc, 0);.  
b250: 61 73 73 65 72 74 28 20 70 46 75 6e 63 20 29 3b  assert( pFunc );
b260: 0a 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66  .  if( (pFunc->f
b270: 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49  uncFlags & (SQLI
b280: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
b290: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 53 4c 4f  |SQLITE_FUNC_SLO
b2a0: 43 48 4e 47 29 29 3d 3d 30 20 0a 20 20 20 7c 7c  CHNG))==0 .   ||
b2b0: 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61   (pFunc->funcFla
b2c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
b2d0: 5f 4e 45 45 44 43 4f 4c 4c 29 0a 20 20 29 7b 0a  _NEEDCOLL).  ){.
b2e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b2f0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
b300: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 70   pList ){.    ap
b310: 56 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Val = (sqlite3_v
b320: 61 6c 75 65 2a 2a 29 73 71 6c 69 74 65 33 44 62  alue**)sqlite3Db
b330: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
b340: 69 7a 65 6f 66 28 61 70 56 61 6c 5b 30 5d 29 20  izeof(apVal[0]) 
b350: 2a 20 6e 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  * nVal);.    if(
b360: 20 61 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20   apVal==0 ){.   
b370: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
b380: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
b390: 20 67 6f 74 6f 20 76 61 6c 75 65 5f 66 72 6f 6d   goto value_from
b3a0: 5f 66 75 6e 63 74 69 6f 6e 5f 6f 75 74 3b 0a 20  _function_out;. 
b3b0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
b3c0: 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
b3d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b3e0: 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
b3f0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
b400: 70 45 78 70 72 2c 20 65 6e 63 2c 20 61 66 66 2c  pExpr, enc, aff,
b410: 20 26 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20   &apVal[i]);.   
b420: 20 20 20 69 66 28 20 61 70 56 61 6c 5b 69 5d 3d     if( apVal[i]=
b430: 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  =0 || rc!=SQLITE
b440: 5f 4f 4b 20 29 20 67 6f 74 6f 20 76 61 6c 75 65  _OK ) goto value
b450: 5f 66 72 6f 6d 5f 66 75 6e 63 74 69 6f 6e 5f 6f  _from_function_o
b460: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
b470: 20 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77   pVal = valueNew
b480: 28 64 62 2c 20 70 43 74 78 29 3b 0a 20 20 69 66  (db, pCtx);.  if
b490: 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( pVal==0 ){.   
b4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
b4b0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  EM_BKPT;.    got
b4c0: 6f 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66 75 6e  o value_from_fun
b4d0: 63 74 69 6f 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  ction_out;.  }..
b4e0: 20 20 61 73 73 65 72 74 28 20 70 43 74 78 2d 3e    assert( pCtx->
b4f0: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
b500: 54 45 5f 4f 4b 20 29 3b 0a 20 20 6d 65 6d 73 65  TE_OK );.  memse
b510: 74 28 26 63 74 78 2c 20 30 2c 20 73 69 7a 65 6f  t(&ctx, 0, sizeo
b520: 66 28 63 74 78 29 29 3b 0a 20 20 63 74 78 2e 70  f(ctx));.  ctx.p
b530: 4f 75 74 20 3d 20 70 56 61 6c 3b 0a 20 20 63 74  Out = pVal;.  ct
b540: 78 2e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b  x.pFunc = pFunc;
b550: 0a 20 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  .  pFunc->xSFunc
b560: 28 26 63 74 78 2c 20 6e 56 61 6c 2c 20 61 70 56  (&ctx, nVal, apV
b570: 61 6c 29 3b 0a 20 20 69 66 28 20 63 74 78 2e 69  al);.  if( ctx.i
b580: 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 72 63  sError ){.    rc
b590: 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a   = ctx.isError;.
b5a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b5b0: 4d 73 67 28 70 43 74 78 2d 3e 70 50 61 72 73 65  Msg(pCtx->pParse
b5c0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
b5d0: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
b5e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b5f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
b600: 79 41 66 66 69 6e 69 74 79 28 70 56 61 6c 2c 20  yAffinity(pVal, 
b610: 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
b620: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
b630: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
b640: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b650: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
b660: 6e 67 28 70 56 61 6c 2c 20 65 6e 63 29 3b 0a 20  ng(pVal, enc);. 
b670: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b680: 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 56  E_OK && sqlite3V
b690: 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61  dbeMemTooBig(pVa
b6a0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  l) ){.      rc =
b6b0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
b6c0: 20 20 20 20 20 20 70 43 74 78 2d 3e 70 50 61 72        pCtx->pPar
b6d0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
b6e0: 7d 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e 70 50  }.  }.  pCtx->pP
b6f0: 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 0a  arse->rc = rc;..
b700: 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66 75 6e 63   value_from_func
b710: 74 69 6f 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  tion_out:.  if( 
b720: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b730: 0a 20 20 20 20 70 56 61 6c 20 3d 20 30 3b 0a 20  .    pVal = 0;. 
b740: 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c 20 29   }.  if( apVal )
b750: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
b760: 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVal; i++){.   
b770: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
b780: 72 65 65 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20  ree(apVal[i]);. 
b790: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b7a0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 70 56  DbFreeNN(db, apV
b7b0: 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56  al);.  }..  *ppV
b7c0: 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72 65 74  al = pVal;.  ret
b7d0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
b7e0: 23 20 64 65 66 69 6e 65 20 76 61 6c 75 65 46 72  # define valueFr
b7f0: 6f 6d 46 75 6e 63 74 69 6f 6e 28 61 2c 62 2c 63  omFunction(a,b,c
b800: 2c 64 2c 65 2c 66 29 20 53 51 4c 49 54 45 5f 4f  ,d,e,f) SQLITE_O
b810: 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  K.#endif /* defi
b820: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b830: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b840: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72  ) */../*.** Extr
b850: 61 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d  act a value from
b860: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 65 78   the supplied ex
b870: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
b880: 6d 61 6e 6e 65 72 20 64 65 73 63 72 69 62 65 64  manner described
b890: 0a 2a 2a 20 61 62 6f 76 65 20 73 71 6c 69 74 65  .** above sqlite
b8a0: 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 29  3ValueFromExpr()
b8b0: 2e 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  . Allocate the s
b8c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
b8d0: 65 63 74 0a 2a 2a 20 75 73 69 6e 67 20 76 61 6c  ect.** using val
b8e0: 75 65 4e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  ueNew()..**.** I
b8f0: 66 20 70 43 74 78 20 69 73 20 4e 55 4c 4c 20 61  f pCtx is NULL a
b900: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  nd an error occu
b910: 72 73 20 61 66 74 65 72 20 74 68 65 20 73 71 6c  rs after the sql
b920: 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63  ite3_value objec
b930: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 6c  t.** has been al
b940: 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 66  located, it is f
b950: 72 65 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  reed before retu
b960: 72 6e 69 6e 67 2e 20 4f 72 2c 20 69 66 20 70 43  rning. Or, if pC
b970: 74 78 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  tx is not.** NUL
b980: 4c 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  L, it is assumed
b990: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
b9a0: 20 77 69 6c 6c 20 66 72 65 65 20 61 6e 79 20 61   will free any a
b9b0: 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 0a  llocated object.
b9c0: 2a 2a 20 69 6e 20 61 6c 6c 20 63 61 73 65 73 2e  ** in all cases.
b9d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
b9e0: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20  alueFromExpr(.  
b9f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
ba20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ba30: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ba60: 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f  n to evaluate */
ba70: 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20  .  u8 enc,      
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 74     /* Encoding t
baa0: 6f 20 75 73 65 20 2a 2f 0a 20 20 75 38 20 61 66  o use */.  u8 af
bab0: 66 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20 20  finity,         
bac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
bad0: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
bae0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
baf0: 20 2a 2a 70 70 56 61 6c 2c 20 20 20 20 20 20 20   **ppVal,       
bb00: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
bb10: 6e 65 77 20 76 61 6c 75 65 20 68 65 72 65 20 2a  new value here *
bb20: 2f 0a 20 20 73 74 72 75 63 74 20 56 61 6c 75 65  /.  struct Value
bb30: 4e 65 77 53 74 61 74 34 43 74 78 20 2a 70 43 74  NewStat4Ctx *pCt
bb40: 78 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 72  x   /* Second ar
bb50: 67 75 6d 65 6e 74 20 66 6f 72 20 76 61 6c 75 65  gument for value
bb60: 4e 65 77 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  New() */.){.  in
bb70: 74 20 6f 70 3b 0a 20 20 63 68 61 72 20 2a 7a 56  t op;.  char *zV
bb80: 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  al = 0;.  sqlite
bb90: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  3_value *pVal = 
bba0: 30 3b 0a 20 20 69 6e 74 20 6e 65 67 49 6e 74 20  0;.  int negInt 
bbb0: 3d 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 1;.  const cha
bbc0: 72 20 2a 7a 4e 65 67 20 3d 20 22 22 3b 0a 20 20  r *zNeg = "";.  
bbd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bbe0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
bbf0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 77 68 69  Expr!=0 );.  whi
bc00: 6c 65 28 20 28 6f 70 20 3d 20 70 45 78 70 72 2d  le( (op = pExpr-
bc10: 3e 6f 70 29 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  >op)==TK_UPLUS |
bc20: 7c 20 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 20  | op==TK_SPAN ) 
bc30: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
bc40: 4c 65 66 74 3b 0a 23 69 66 20 64 65 66 69 6e 65  Left;.#if define
bc50: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
bc60: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 29 0a  STAT3_OR_STAT4).
bc70: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
bc80: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 45 78  ISTER ) op = pEx
bc90: 70 72 2d 3e 6f 70 32 3b 0a 23 65 6c 73 65 0a 20  pr->op2;.#else. 
bca0: 20 69 66 28 20 4e 45 56 45 52 28 6f 70 3d 3d 54   if( NEVER(op==T
bcb0: 4b 5f 52 45 47 49 53 54 45 52 29 20 29 20 6f 70  K_REGISTER) ) op
bcc0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 23   = pExpr->op2;.#
bcd0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
bce0: 72 65 73 73 65 64 20 65 78 70 72 65 73 73 69 6f  ressed expressio
bcf0: 6e 73 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 77  ns only appear w
bd00: 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20  hen parsing the 
bd10: 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65 0a 20  DEFAULT clause. 
bd20: 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 20 63   ** on a table c
bd30: 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
bd40: 2c 20 61 6e 64 20 68 65 6e 63 65 20 6f 6e 6c 79  , and hence only
bd50: 20 77 68 65 6e 20 70 43 74 78 3d 3d 30 2e 20 20   when pCtx==0.  
bd60: 54 68 69 73 0a 20 20 2a 2a 20 63 68 65 63 6b 20  This.  ** check 
bd70: 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6e 20  ensures that an 
bd80: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 20 65 78 70  EP_TokenOnly exp
bd90: 72 65 73 73 69 6f 6e 20 69 73 20 6e 65 76 65 72  ression is never
bda0: 20 70 61 73 73 65 64 20 64 6f 77 6e 0a 20 20 2a   passed down.  *
bdb0: 2a 20 69 6e 74 6f 20 76 61 6c 75 65 46 72 6f 6d  * into valueFrom
bdc0: 46 75 6e 63 74 69 6f 6e 28 29 2e 20 2a 2f 0a 20  Function(). */. 
bdd0: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
bde0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  >flags & EP_Toke
bdf0: 6e 4f 6e 6c 79 29 3d 3d 30 20 7c 7c 20 70 43 74  nOnly)==0 || pCt
be00: 78 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6f  x==0 );..  if( o
be10: 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20  p==TK_CAST ){.  
be20: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
be30: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
be40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30  Expr->u.zToken,0
be50: 29 3b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75  );.    rc = valu
be60: 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 45  eFromExpr(db, pE
be70: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 65 6e 63 2c  xpr->pLeft, enc,
be80: 20 61 66 66 2c 20 70 70 56 61 6c 2c 20 70 43 74   aff, ppVal, pCt
be90: 78 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  x);.    testcase
bea0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
beb0: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 70 56 61  );.    if( *ppVa
bec0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
bed0: 65 33 56 64 62 65 4d 65 6d 43 61 73 74 28 2a 70  e3VdbeMemCast(*p
bee0: 70 56 61 6c 2c 20 61 66 66 2c 20 53 51 4c 49 54  pVal, aff, SQLIT
bef0: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 73  E_UTF8);.      s
bf00: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
bf10: 41 66 66 69 6e 69 74 79 28 2a 70 70 56 61 6c 2c  Affinity(*ppVal,
bf20: 20 61 66 66 69 6e 69 74 79 2c 20 53 51 4c 49 54   affinity, SQLIT
bf30: 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 7d 0a 20  E_UTF8);.    }. 
bf40: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
bf50: 7d 0a 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6e  }..  /* Handle n
bf60: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73  egative integers
bf70: 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 74 65   in a single ste
bf80: 70 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  p.  This is need
bf90: 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63  ed in the.  ** c
bfa0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 76 61 6c  ase when the val
bfb0: 75 65 20 69 73 20 2d 39 32 32 33 33 37 32 30 33  ue is -922337203
bfc0: 36 38 35 34 37 37 35 38 30 38 2e 0a 20 20 2a 2f  6854775808..  */
bfd0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 55 4d  .  if( op==TK_UM
bfe0: 49 4e 55 53 0a 20 20 20 26 26 20 28 70 45 78 70  INUS.   && (pExp
bff0: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
c000: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 45 78 70  _INTEGER || pExp
c010: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
c020: 5f 46 4c 4f 41 54 29 20 29 7b 0a 20 20 20 20 70  _FLOAT) ){.    p
c030: 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Expr = pExpr->pL
c040: 65 66 74 3b 0a 20 20 20 20 6f 70 20 3d 20 70 45  eft;.    op = pE
c050: 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 6e 65 67  xpr->op;.    neg
c060: 49 6e 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7a 4e  Int = -1;.    zN
c070: 65 67 20 3d 20 22 2d 22 3b 0a 20 20 7d 0a 0a 20  eg = "-";.  }.. 
c080: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49   if( op==TK_STRI
c090: 4e 47 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 46 4c 4f  NG || op==TK_FLO
c0a0: 41 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  AT || op==TK_INT
c0b0: 45 47 45 52 20 29 7b 0a 20 20 20 20 70 56 61 6c  EGER ){.    pVal
c0c0: 20 3d 20 76 61 6c 75 65 4e 65 77 28 64 62 2c 20   = valueNew(db, 
c0d0: 70 43 74 78 29 3b 0a 20 20 20 20 69 66 28 20 70  pCtx);.    if( p
c0e0: 56 61 6c 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  Val==0 ) goto no
c0f0: 5f 6d 65 6d 3b 0a 20 20 20 20 69 66 28 20 45 78  _mem;.    if( Ex
c100: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
c110: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
c120: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
c130: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
c140: 34 28 70 56 61 6c 2c 20 28 69 36 34 29 70 45 78  4(pVal, (i64)pEx
c150: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 2a 6e 65 67  pr->u.iValue*neg
c160: 49 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Int);.    }else{
c170: 0a 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 73 71  .      zVal = sq
c180: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c190: 20 22 25 73 25 73 22 2c 20 7a 4e 65 67 2c 20 70   "%s%s", zNeg, p
c1a0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
c1b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c 3d  .      if( zVal=
c1c0: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
c1d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c1e0: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
c1f0: 20 2d 31 2c 20 7a 56 61 6c 2c 20 53 51 4c 49 54   -1, zVal, SQLIT
c200: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 44  E_UTF8, SQLITE_D
c210: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
c220: 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 49     if( (op==TK_I
c230: 4e 54 45 47 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  NTEGER || op==TK
c240: 5f 46 4c 4f 41 54 20 29 20 26 26 20 61 66 66 69  _FLOAT ) && affi
c250: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c260: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 73  _BLOB ){.      s
c270: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
c280: 41 66 66 69 6e 69 74 79 28 70 56 61 6c 2c 20 53  Affinity(pVal, S
c290: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
c2a0: 43 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  C, SQLITE_UTF8);
c2b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c2c0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
c2d0: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 56 61 6c  plyAffinity(pVal
c2e0: 2c 20 61 66 66 69 6e 69 74 79 2c 20 53 51 4c 49  , affinity, SQLI
c2f0: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 7d 0a  TE_UTF8);.    }.
c300: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 56 61      assert( (pVa
c310: 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  l->flags & MEM_I
c320: 6e 74 52 65 61 6c 29 3d 3d 30 20 29 3b 0a 20 20  ntReal)==0 );.  
c330: 20 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67    if( pVal->flag
c340: 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
c350: 5f 49 6e 74 52 65 61 6c 7c 4d 45 4d 5f 52 65 61  _IntReal|MEM_Rea
c360: 6c 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  l) ){.      test
c370: 63 61 73 65 28 20 70 56 61 6c 2d 3e 66 6c 61 67  case( pVal->flag
c380: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
c390: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c3a0: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Val->flags & MEM
c3b0: 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 70  _Real );.      p
c3c0: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d  Val->flags &= ~M
c3d0: 45 4d 5f 53 74 72 3b 0a 20 20 20 20 7d 0a 20 20  EM_Str;.    }.  
c3e0: 20 20 69 66 28 20 65 6e 63 21 3d 53 51 4c 49 54    if( enc!=SQLIT
c3f0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20  E_UTF8 ){.      
c400: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
c410: 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
c420: 56 61 6c 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d  Val, enc);.    }
c430: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
c440: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 20 7b 0a 20  =TK_UMINUS ) {. 
c450: 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
c460: 68 20 68 61 70 70 65 6e 73 20 66 6f 72 20 6d 75  h happens for mu
c470: 6c 74 69 70 6c 65 20 6e 65 67 61 74 69 76 65 20  ltiple negative 
c480: 73 69 67 6e 73 2e 20 20 45 78 3a 20 2d 28 2d 35  signs.  Ex: -(-5
c490: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  ) */.    if( SQL
c4a0: 49 54 45 5f 4f 4b 3d 3d 76 61 6c 75 65 46 72 6f  ITE_OK==valueFro
c4b0: 6d 45 78 70 72 28 64 62 2c 70 45 78 70 72 2d 3e  mExpr(db,pExpr->
c4c0: 70 4c 65 66 74 2c 65 6e 63 2c 61 66 66 69 6e 69  pLeft,enc,affini
c4d0: 74 79 2c 26 70 56 61 6c 2c 70 43 74 78 29 20 0a  ty,&pVal,pCtx) .
c4e0: 20 20 20 20 20 26 26 20 70 56 61 6c 21 3d 30 0a       && pVal!=0.
c4f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
c500: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72  ite3VdbeMemNumer
c510: 69 66 79 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  ify(pVal);.     
c520: 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73   if( pVal->flags
c530: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
c540: 20 20 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e 72         pVal->u.r
c550: 20 3d 20 2d 70 56 61 6c 2d 3e 75 2e 72 3b 0a 20   = -pVal->u.r;. 
c560: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c570: 56 61 6c 2d 3e 75 2e 69 3d 3d 53 4d 41 4c 4c 45  Val->u.i==SMALLE
c580: 53 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20  ST_INT64 ){.    
c590: 20 20 20 20 70 56 61 6c 2d 3e 75 2e 72 20 3d 20      pVal->u.r = 
c5a0: 2d 28 64 6f 75 62 6c 65 29 53 4d 41 4c 4c 45 53  -(double)SMALLES
c5b0: 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 20 20 20  T_INT64;.       
c5c0: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
c5d0: 70 56 61 6c 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pVal, MEM_Real);
c5e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c5f0: 20 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e 69 20        pVal->u.i 
c600: 3d 20 2d 70 56 61 6c 2d 3e 75 2e 69 3b 0a 20 20  = -pVal->u.i;.  
c610: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c620: 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
c630: 69 6e 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69  inity(pVal, affi
c640: 6e 69 74 79 2c 20 65 6e 63 29 3b 0a 20 20 20 20  nity, enc);.    
c650: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  }.  }else if( op
c660: 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
c670: 20 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77   pVal = valueNew
c680: 28 64 62 2c 20 70 43 74 78 29 3b 0a 20 20 20 20  (db, pCtx);.    
c690: 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 67 6f  if( pVal==0 ) go
c6a0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73  to no_mem;.    s
c6b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
c6c0: 4e 75 6c 6c 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  Null(pVal);.  }.
c6d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c6e0: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
c6f0: 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d  .  else if( op==
c700: 54 4b 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 69  TK_BLOB ){.    i
c710: 6e 74 20 6e 56 61 6c 3b 0a 20 20 20 20 61 73 73  nt nVal;.    ass
c720: 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
c730: 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
c740: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
c750: 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 61  0]=='X' );.    a
c760: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
c770: 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
c780: 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61  );.    pVal = va
c790: 6c 75 65 4e 65 77 28 64 62 2c 20 70 43 74 78 29  lueNew(db, pCtx)
c7a0: 3b 0a 20 20 20 20 69 66 28 20 21 70 56 61 6c 20  ;.    if( !pVal 
c7b0: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
c7c0: 20 20 20 7a 56 61 6c 20 3d 20 26 70 45 78 70 72     zVal = &pExpr
c7d0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
c7e0: 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
c7f0: 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 2d  3Strlen30(zVal)-
c800: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  1;.    assert( z
c810: 56 61 6c 5b 6e 56 61 6c 5d 3d 3d 27 5c 27 27 20  Val[nVal]=='\'' 
c820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c830: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 56 61 6c  beMemSetStr(pVal
c840: 2c 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  , sqlite3HexToBl
c850: 6f 62 28 64 62 2c 20 7a 56 61 6c 2c 20 6e 56 61  ob(db, zVal, nVa
c860: 6c 29 2c 20 6e 56 61 6c 2f 32 2c 0a 20 20 20 20  l), nVal/2,.    
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 44       0, SQLITE_D
c890: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
c8a0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
c8b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c8c0: 52 5f 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69  R_STAT4.  else i
c8d0: 66 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  f( op==TK_FUNCTI
c8e0: 4f 4e 20 26 26 20 70 43 74 78 21 3d 30 20 29 7b  ON && pCtx!=0 ){
c8f0: 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46  .    rc = valueF
c900: 72 6f 6d 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  romFunction(db, 
c910: 70 45 78 70 72 2c 20 65 6e 63 2c 20 61 66 66 69  pExpr, enc, affi
c920: 6e 69 74 79 2c 20 26 70 56 61 6c 2c 20 70 43 74  nity, &pVal, pCt
c930: 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  x);.  }.#endif. 
c940: 20 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b   else if( op==TK
c950: 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20  _TRUEFALSE ){.  
c960: 20 20 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65    pVal = valueNe
c970: 77 28 64 62 2c 20 70 43 74 78 29 3b 0a 20 20 20  w(db, pCtx);.   
c980: 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
c990: 20 20 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 3d     pVal->flags =
c9a0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
c9b0: 70 56 61 6c 2d 3e 75 2e 69 20 3d 20 70 45 78 70  pVal->u.i = pExp
c9c0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 34 5d 3d 3d  r->u.zToken[4]==
c9d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
c9e0: 2a 70 70 56 61 6c 20 3d 20 70 56 61 6c 3b 0a 20  *ppVal = pVal;. 
c9f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 6e 6f 5f   return rc;..no_
ca00: 6d 65 6d 3a 0a 23 69 66 64 65 66 20 53 51 4c 49  mem:.#ifdef SQLI
ca10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ca20: 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
ca30: 43 74 78 3d 3d 30 20 7c 7c 20 70 43 74 78 2d 3e  Ctx==0 || pCtx->
ca40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
ca50: 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ).#endif.    sql
ca60: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
ca70: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
ca80: 65 28 64 62 2c 20 7a 56 61 6c 29 3b 0a 20 20 61  e(db, zVal);.  a
ca90: 73 73 65 72 74 28 20 2a 70 70 56 61 6c 3d 3d 30  ssert( *ppVal==0
caa0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
cab0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
cac0: 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 43  R_STAT4.  if( pC
cad0: 74 78 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  tx==0 ) sqlite3V
cae0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
caf0: 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
cb00: 70 43 74 78 3d 3d 30 20 29 3b 20 73 71 6c 69 74  pCtx==0 ); sqlit
cb10: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
cb20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
cb30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
cb40: 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
cb50: 72 65 61 74 65 20 61 20 6e 65 77 20 73 71 6c 69  reate a new sqli
cb60: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
cb70: 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  , containing the
cb80: 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2e   value of pExpr.
cb90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 6e 6c 79  .**.** This only
cba0: 20 77 6f 72 6b 73 20 66 6f 72 20 76 65 72 79 20   works for very 
cbb0: 73 69 6d 70 6c 65 20 65 78 70 72 65 73 73 69 6f  simple expressio
cbc0: 6e 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20  ns that consist 
cbd0: 6f 66 20 6f 6e 65 20 63 6f 6e 73 74 61 6e 74 0a  of one constant.
cbe0: 2a 2a 20 74 6f 6b 65 6e 20 28 69 2e 65 2e 20 22  ** token (i.e. "
cbf0: 35 22 2c 20 22 35 2e 31 22 2c 20 22 27 61 20 73  5", "5.1", "'a s
cc00: 74 72 69 6e 67 27 22 29 2e 20 49 66 20 74 68 65  tring'"). If the
cc10: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 0a   expression can.
cc20: 2a 2a 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ** be converted 
cc30: 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 61 20  directly into a 
cc40: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
cc50: 76 61 6c 75 65 20 69 73 20 61 6c 6c 6f 63 61 74  value is allocat
cc60: 65 64 20 61 6e 64 0a 2a 2a 20 61 20 70 6f 69 6e  ed and.** a poin
cc70: 74 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  ter written to *
cc80: 70 70 56 61 6c 2e 20 54 68 65 20 63 61 6c 6c 65  ppVal. The calle
cc90: 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
cca0: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e   for deallocatin
ccb0: 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 62  g.** the value b
ccc0: 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  y passing it to 
ccd0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
cce0: 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 49 66 20  () later on. If 
ccf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
cd00: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  * cannot be conv
cd10: 65 72 74 65 64 20 74 6f 20 61 20 76 61 6c 75 65  erted to a value
cd20: 2c 20 74 68 65 6e 20 2a 70 70 56 61 6c 20 69 73  , then *ppVal is
cd30: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
cd40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75  .int sqlite3Valu
cd50: 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 73 71 6c  eFromExpr(.  sql
cd60: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
cd70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
cd80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
cd90: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
cda0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
cdb0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
cdc0: 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 2a  on to evaluate *
cdd0: 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20  /.  u8 enc,     
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cdf0: 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73 65   Encoding to use
ce00: 20 2a 2f 0a 20 20 75 38 20 61 66 66 69 6e 69 74   */.  u8 affinit
ce10: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
ce20: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75  /* Affinity to u
ce30: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
ce40: 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 20 20 20  value **ppVal   
ce50: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
ce60: 65 77 20 76 61 6c 75 65 20 68 65 72 65 20 2a 2f  ew value here */
ce70: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 45 78  .){.  return pEx
ce80: 70 72 20 3f 20 76 61 6c 75 65 46 72 6f 6d 45 78  pr ? valueFromEx
ce90: 70 72 28 64 62 2c 20 70 45 78 70 72 2c 20 65 6e  pr(db, pExpr, en
cea0: 63 2c 20 61 66 66 69 6e 69 74 79 2c 20 70 70 56  c, affinity, ppV
ceb0: 61 6c 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 0a 23  al, 0) : 0;.}..#
cec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ced0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
cee0: 54 34 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  T4./*.** The imp
cef0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
cf00: 68 65 20 73 71 6c 69 74 65 5f 72 65 63 6f 72 64  he sqlite_record
cf10: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69  () function. Thi
cf20: 73 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65 70  s function accep
cf30: 74 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61  ts.** a single a
cf40: 72 67 75 6d 65 6e 74 20 6f 66 20 61 6e 79 20 74  rgument of any t
cf50: 79 70 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ype. The return 
cf60: 76 61 6c 75 65 20 69 73 20 61 20 66 6f 72 6d 61  value is a forma
cf70: 74 74 65 64 20 64 61 74 61 62 61 73 65 20 0a 2a  tted database .*
cf80: 2a 20 72 65 63 6f 72 64 20 28 61 20 62 6c 6f 62  * record (a blob
cf90: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
cfa0: 20 61 72 67 75 6d 65 6e 74 20 76 61 6c 75 65 2e   argument value.
cfb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
cfc0: 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74  sed to convert t
cfd0: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
cfe0: 69 6e 20 74 68 65 20 27 73 61 6d 70 6c 65 27 20  in the 'sample' 
cff0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a  column of the.**
d000: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
d010: 62 6c 65 20 74 6f 20 74 68 65 20 72 65 63 6f 72  ble to the recor
d020: 64 20 66 6f 72 6d 61 74 20 53 51 4c 69 74 65 20  d format SQLite 
d030: 75 73 65 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  uses internally.
d040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d050: 72 65 63 6f 72 64 46 75 6e 63 28 0a 20 20 73 71  recordFunc(.  sq
d060: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
d070: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
d080: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
d090: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
d0a0: 63 6f 6e 73 74 20 69 6e 74 20 66 69 6c 65 5f 66  const int file_f
d0b0: 6f 72 6d 61 74 20 3d 20 31 3b 0a 20 20 75 33 32  ormat = 1;.  u32
d0c0: 20 69 53 65 72 69 61 6c 3b 20 20 20 20 20 20 20   iSerial;       
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0e0: 53 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20  Serial type */. 
d0f0: 20 69 6e 74 20 6e 53 65 72 69 61 6c 3b 20 20 20   int nSerial;   
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
d120: 63 65 20 66 6f 72 20 69 53 65 72 69 61 6c 20 61  ce for iSerial a
d130: 73 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  s varint */.  u3
d140: 32 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20  2 nVal;         
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d160: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
d170: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 72 67  required for arg
d180: 76 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  v[0] */.  int nR
d190: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  et;.  sqlite3 *d
d1a0: 62 3b 0a 20 20 75 38 20 2a 61 52 65 74 3b 0a 0a  b;.  u8 *aRet;..
d1b0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d1c0: 45 52 28 20 61 72 67 63 20 29 3b 0a 20 20 69 53  ER( argc );.  iS
d1d0: 65 72 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 56  erial = sqlite3V
d1e0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 61 72  dbeSerialType(ar
d1f0: 67 76 5b 30 5d 2c 20 66 69 6c 65 5f 66 6f 72 6d  gv[0], file_form
d200: 61 74 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 6e 53  at, &nVal);.  nS
d210: 65 72 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 56  erial = sqlite3V
d220: 61 72 69 6e 74 4c 65 6e 28 69 53 65 72 69 61 6c  arintLen(iSerial
d230: 29 3b 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  );.  db = sqlite
d240: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
d250: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20  dle(context);.. 
d260: 20 6e 52 65 74 20 3d 20 31 20 2b 20 6e 53 65 72   nRet = 1 + nSer
d270: 69 61 6c 20 2b 20 6e 56 61 6c 3b 0a 20 20 61 52  ial + nVal;.  aR
d280: 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
d290: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 52  llocRawNN(db, nR
d2a0: 65 74 29 3b 0a 20 20 69 66 28 20 61 52 65 74 3d  et);.  if( aRet=
d2b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
d2c0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
d2d0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
d2e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 74   }else{.    aRet
d2f0: 5b 30 5d 20 3d 20 6e 53 65 72 69 61 6c 2b 31 3b  [0] = nSerial+1;
d300: 0a 20 20 20 20 70 75 74 56 61 72 69 6e 74 33 32  .    putVarint32
d310: 28 26 61 52 65 74 5b 31 5d 2c 20 69 53 65 72 69  (&aRet[1], iSeri
d320: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
d330: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 26 61  VdbeSerialPut(&a
d340: 52 65 74 5b 31 2b 6e 53 65 72 69 61 6c 5d 2c 20  Ret[1+nSerial], 
d350: 61 72 67 76 5b 30 5d 2c 20 69 53 65 72 69 61 6c  argv[0], iSerial
d360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
d370: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
d380: 78 74 2c 20 61 52 65 74 2c 20 6e 52 65 74 2c 20  xt, aRet, nRet, 
d390: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d3a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
d3b0: 46 72 65 65 4e 4e 28 64 62 2c 20 61 52 65 74 29  FreeNN(db, aRet)
d3c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
d3d0: 65 67 69 73 74 65 72 20 62 75 69 6c 74 2d 69 6e  egister built-in
d3e0: 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20   functions used 
d3f0: 74 6f 20 68 65 6c 70 20 72 65 61 64 20 41 4e 41  to help read ANA
d400: 4c 59 5a 45 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  LYZE data..*/.vo
d410: 69 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a  id sqlite3Analyz
d420: 65 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  eFunctions(void)
d430: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
d440: 65 66 20 61 41 6e 61 6c 79 7a 65 54 61 62 6c 65  ef aAnalyzeTable
d450: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
d460: 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f  FUNCTION(sqlite_
d470: 72 65 63 6f 72 64 2c 20 20 20 31 2c 20 30 2c 20  record,   1, 0, 
d480: 30 2c 20 72 65 63 6f 72 64 46 75 6e 63 29 2c 0a  0, recordFunc),.
d490: 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e    };.  sqlite3In
d4a0: 73 65 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73  sertBuiltinFuncs
d4b0: 28 61 41 6e 61 6c 79 7a 65 54 61 62 6c 65 46 75  (aAnalyzeTableFu
d4c0: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
d4d0: 41 6e 61 6c 79 7a 65 54 61 62 6c 65 46 75 6e 63  AnalyzeTableFunc
d4e0: 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  s));.}../*.** At
d4f0: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
d500: 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 70 45   a value from pE
d510: 78 70 72 20 61 6e 64 20 75 73 65 20 69 74 20 74  xpr and use it t
d520: 6f 20 63 6f 6e 73 74 72 75 63 74 20 2a 70 70 56  o construct *ppV
d530: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 6c  al..**.** If pAl
d540: 6c 6f 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  loc is not NULL,
d550: 20 74 68 65 6e 20 61 6e 20 55 6e 70 61 63 6b 65   then an Unpacke
d560: 64 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 20 69  dRecord object i
d570: 73 20 63 72 65 61 74 65 64 20 66 6f 72 0a 2a 2a  s created for.**
d580: 20 70 41 6c 6c 6f 63 20 69 66 20 6f 6e 65 20 64   pAlloc if one d
d590: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 61 6e  oes not exist an
d5a0: 64 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  d the new value 
d5b0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 0a  is added to the.
d5c0: 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
d5d0: 64 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  d object..**.** 
d5e0: 41 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  A value is extra
d5f0: 63 74 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  cted in the foll
d600: 6f 77 69 6e 67 20 63 61 73 65 73 3a 0a 2a 2a 0a  owing cases:.**.
d610: 2a 2a 20 20 2a 20 28 70 45 78 70 72 3d 3d 30 29  **  * (pExpr==0)
d620: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
d630: 68 65 20 76 61 6c 75 65 20 69 73 20 61 73 73 75  he value is assu
d640: 6d 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c  med to be an SQL
d650: 20 4e 55 4c 4c 2c 0a 2a 2a 0a 2a 2a 20 20 2a 20   NULL,.**.**  * 
d660: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
d670: 73 20 61 20 62 6f 75 6e 64 20 76 61 72 69 61 62  s a bound variab
d680: 6c 65 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  le, and this is 
d690: 61 20 72 65 70 72 65 70 61 72 65 2c 20 6f 72 0a  a reprepare, or.
d6a0: 2a 2a 0a 2a 2a 20 20 2a 20 54 68 65 20 65 78 70  **.**  * The exp
d6b0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 6c 69 74  ression is a lit
d6c0: 65 72 61 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  eral value..**.*
d6d0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 2a 70  * On success, *p
d6e0: 70 56 61 6c 20 69 73 20 6d 61 64 65 20 74 6f 20  pVal is made to 
d6f0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 78 74  point to the ext
d700: 72 61 63 74 65 64 20 76 61 6c 75 65 2e 20 20 54  racted value.  T
d710: 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 69 73 20  he caller.** is 
d720: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
d730: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
d740: 65 20 76 61 6c 75 65 20 69 73 20 65 76 65 6e 74  e value is event
d750: 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2f 0a  ually freed..*/.
d760: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 34  static int stat4
d770: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  ValueFromExpr(. 
d780: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
d7b0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
d7c0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
d7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
d7e0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 65 78 74 72  pression to extr
d7f0: 61 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d  act a value from
d800: 20 2a 2f 0a 20 20 75 38 20 61 66 66 69 6e 69 74   */.  u8 affinit
d810: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
d820: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
d830: 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 74  y to use */.  st
d840: 72 75 63 74 20 56 61 6c 75 65 4e 65 77 53 74 61  ruct ValueNewSta
d850: 74 34 43 74 78 20 2a 70 41 6c 6c 6f 63 2c 2f 2a  t4Ctx *pAlloc,/*
d860: 20 48 6f 77 20 74 6f 20 61 6c 6c 6f 63 61 74 65   How to allocate
d870: 20 73 70 61 63 65 2e 20 20 4f 72 20 4e 55 4c 4c   space.  Or NULL
d880: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
d890: 6c 75 65 20 2a 2a 70 70 56 61 6c 20 20 20 20 20  lue **ppVal     
d8a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
d8b0: 77 20 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 28  w value object (
d8c0: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 29 7b 0a 20  or NULL) */.){. 
d8d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d8e0: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  _OK;.  sqlite3_v
d8f0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
d900: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d910: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
d920: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
d930: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6e 6f 64 65 73  TK_COLLATE nodes
d940: 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 73 71   */.  pExpr = sq
d950: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
d960: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 0a 20 20  late(pExpr);..  
d970: 61 73 73 65 72 74 28 20 70 45 78 70 72 3d 3d 30  assert( pExpr==0
d980: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   || pExpr->op!=T
d990: 4b 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 70 45  K_REGISTER || pE
d9a0: 78 70 72 2d 3e 6f 70 32 21 3d 54 4b 5f 56 41 52  xpr->op2!=TK_VAR
d9b0: 49 41 42 4c 45 20 29 3b 0a 20 20 69 66 28 20 21  IABLE );.  if( !
d9c0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 56 61  pExpr ){.    pVa
d9d0: 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28 64 62 2c  l = valueNew(db,
d9e0: 20 70 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66   pAlloc);.    if
d9f0: 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 20 20  ( pVal ){.      
da00: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
da10: 74 4e 75 6c 6c 28 28 4d 65 6d 2a 29 70 56 61 6c  tNull((Mem*)pVal
da20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
da30: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
da40: 54 4b 5f 56 41 52 49 41 42 4c 45 20 26 26 20 28  TK_VARIABLE && (
da50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
da60: 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
da70: 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
da80: 3b 0a 20 20 20 20 69 6e 74 20 69 42 69 6e 64 56  ;.    int iBindV
da90: 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ar = pExpr->iCol
daa0: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
dab0: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
dac0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 42  Parse->pVdbe, iB
dad0: 69 6e 64 56 61 72 29 3b 0a 20 20 20 20 69 66 28  indVar);.    if(
dae0: 20 28 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 52   (v = pParse->pR
daf0: 65 70 72 65 70 61 72 65 29 21 3d 30 20 29 7b 0a  eprepare)!=0 ){.
db00: 20 20 20 20 20 20 70 56 61 6c 20 3d 20 76 61 6c        pVal = val
db10: 75 65 4e 65 77 28 64 62 2c 20 70 41 6c 6c 6f 63  ueNew(db, pAlloc
db20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
db30: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
db40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
db50: 43 6f 70 79 28 28 4d 65 6d 2a 29 70 56 61 6c 2c  Copy((Mem*)pVal,
db60: 20 26 76 2d 3e 61 56 61 72 5b 69 42 69 6e 64 56   &v->aVar[iBindV
db70: 61 72 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ar-1]);.        
db80: 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
db90: 79 41 66 66 69 6e 69 74 79 28 70 56 61 6c 2c 20  yAffinity(pVal, 
dba0: 61 66 66 69 6e 69 74 79 2c 20 45 4e 43 28 64 62  affinity, ENC(db
dbb0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 56 61 6c  ));.        pVal
dbc0: 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  ->db = pParse->d
dbd0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
dbe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
dbf0: 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
dc00: 28 64 62 2c 20 70 45 78 70 72 2c 20 45 4e 43 28  (db, pExpr, ENC(
dc10: 64 62 29 2c 20 61 66 66 69 6e 69 74 79 2c 20 26  db), affinity, &
dc20: 70 56 61 6c 2c 20 70 41 6c 6c 6f 63 29 3b 0a 20  pVal, pAlloc);. 
dc30: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56   }..  assert( pV
dc40: 61 6c 3d 3d 30 20 7c 7c 20 70 56 61 6c 2d 3e 64  al==0 || pVal->d
dc50: 62 3d 3d 64 62 20 29 3b 0a 20 20 2a 70 70 56 61  b==db );.  *ppVa
dc60: 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72 65 74 75  l = pVal;.  retu
dc70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
dc80: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
dc90: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
dca0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 55  e and populate U
dcb0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 0a 2a  npackedRecord .*
dcc0: 2a 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 74  * structures int
dcd0: 65 6e 64 65 64 20 74 6f 20 62 65 20 63 6f 6d 70  ended to be comp
dce0: 61 72 65 64 20 61 67 61 69 6e 73 74 20 73 61 6d  ared against sam
dcf0: 70 6c 65 20 69 6e 64 65 78 20 6b 65 79 73 20 73  ple index keys s
dd00: 74 6f 72 65 64 20 0a 2a 2a 20 69 6e 20 74 68 65  tored .** in the
dd10: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61   sqlite_stat4 ta
dd20: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e  ble..**.** A sin
dd30: 67 6c 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  gle call to this
dd40: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
dd50: 74 65 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  tes zero or more
dd60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a   fields of the.*
dd70: 2a 20 72 65 63 6f 72 64 20 73 74 61 72 74 69 6e  * record startin
dd80: 67 20 77 69 74 68 20 66 69 65 6c 64 20 69 56 61  g with field iVa
dd90: 6c 20 28 66 69 65 6c 64 73 20 61 72 65 20 6e 75  l (fields are nu
dda0: 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74  mbered from left
ddb0: 20 74 6f 0a 2a 2a 20 72 69 67 68 74 20 73 74 61   to.** right sta
ddc0: 72 74 69 6e 67 20 77 69 74 68 20 30 29 2e 20 41  rting with 0). A
ddd0: 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 69 73   single field is
dde0: 20 70 6f 70 75 6c 61 74 65 64 20 69 66 3a 0a 2a   populated if:.*
ddf0: 2a 0a 2a 2a 20 20 2a 20 28 70 45 78 70 72 3d 3d  *.**  * (pExpr==
de00: 30 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  0). In this case
de10: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 73   the value is as
de20: 73 75 6d 65 64 20 74 6f 20 62 65 20 61 6e 20 53  sumed to be an S
de30: 51 4c 20 4e 55 4c 4c 2c 0a 2a 2a 0a 2a 2a 20 20  QL NULL,.**.**  
de40: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
de50: 20 69 73 20 61 20 62 6f 75 6e 64 20 76 61 72 69   is a bound vari
de60: 61 62 6c 65 2c 20 61 6e 64 20 74 68 69 73 20 69  able, and this i
de70: 73 20 61 20 72 65 70 72 65 70 61 72 65 2c 20 6f  s a reprepare, o
de80: 72 0a 2a 2a 0a 2a 2a 20 20 2a 20 54 68 65 20 73  r.**.**  * The s
de90: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
dea0: 78 70 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  xpr() function i
deb0: 73 20 61 62 6c 65 20 74 6f 20 65 78 74 72 61 63  s able to extrac
dec0: 74 20 61 20 76 61 6c 75 65 20 0a 2a 2a 20 20 20  t a value .**   
ded0: 20 66 72 6f 6d 20 74 68 65 20 65 78 70 72 65 73   from the expres
dee0: 73 69 6f 6e 20 28 69 2e 65 2e 20 74 68 65 20 65  sion (i.e. the e
def0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 6c  xpression is a l
df00: 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2e 0a 2a  iteral value)..*
df10: 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 45 78 70  *.** Or, if pExp
df20: 72 20 69 73 20 61 20 54 4b 5f 56 45 43 54 4f 52  r is a TK_VECTOR
df30: 2c 20 6f 6e 65 20 66 69 65 6c 64 20 69 73 20 70  , one field is p
df40: 6f 70 75 6c 61 74 65 64 20 66 6f 72 20 65 61 63  opulated for eac
df50: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 76 65 63 74  h of the.** vect
df60: 6f 72 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 74 68  or components th
df70: 61 74 20 6d 61 74 63 68 20 65 69 74 68 65 72 20  at match either 
df80: 6f 66 20 74 68 65 20 74 77 6f 20 6c 61 74 74 65  of the two latte
df90: 72 20 63 72 69 74 65 72 69 61 20 6c 69 73 74 65  r criteria liste
dfa0: 64 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  d.** above..**.*
dfb0: 2a 20 42 65 66 6f 72 65 20 61 6e 79 20 76 61 6c  * Before any val
dfc0: 75 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  ue is appended t
dfd0: 6f 20 74 68 65 20 72 65 63 6f 72 64 2c 20 74 68  o the record, th
dfe0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
dff0: 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
e000: 69 6e 67 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69  ing column withi
e010: 6e 20 69 6e 64 65 78 20 70 49 64 78 20 69 73 20  n index pIdx is 
e020: 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2e 20 42  applied to it. B
e030: 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66 75  efore.** this fu
e040: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
e050: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
e060: 20 2a 70 6e 45 78 74 72 61 63 74 20 69 73 20 73   *pnExtract is s
e070: 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 75 6d  et to the.** num
e080: 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 61 70  ber of values ap
e090: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 72 65  pended to the re
e0a0: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cord..**.** When
e0b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
e0c0: 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 52 65 63  s called, *ppRec
e0d0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69   must either poi
e0e0: 6e 74 20 74 6f 20 61 6e 20 6f 62 6a 65 63 74 0a  nt to an object.
e0f0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
e100: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
e110: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
e120: 2c 20 6f 72 20 6d 75 73 74 20 62 65 20 4e 55 4c  , or must be NUL
e130: 4c 2e 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 4e  L. If it.** is N
e140: 55 4c 4c 20 61 6e 64 20 61 20 76 61 6c 75 65 20  ULL and a value 
e150: 63 61 6e 20 62 65 20 73 75 63 63 65 73 73 66 75  can be successfu
e160: 6c 6c 79 20 65 78 74 72 61 63 74 65 64 2c 20 61  lly extracted, a
e170: 20 6e 65 77 20 55 6e 70 61 63 6b 65 64 52 65 63   new UnpackedRec
e180: 6f 72 64 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  ord.** is alloca
e190: 74 65 64 20 28 61 6e 64 20 2a 70 70 52 65 63 20  ted (and *ppRec 
e1a0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
e1b0: 69 74 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  it) before retur
e1c0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  ning..**.** Unle
e1d0: 73 73 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  ss an error is e
e1e0: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 53 51 4c 49  ncountered, SQLI
e1f0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
e200: 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 61 6e 0a  d. It is not an.
e210: 2a 2a 20 65 72 72 6f 72 20 69 66 20 61 20 76 61  ** error if a va
e220: 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78  lue cannot be ex
e230: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
e240: 70 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  pr. If an error 
e250: 64 6f 65 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 61  does.** occur, a
e260: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
e270: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
e280: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
e290: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e2a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
e2b0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
e2c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
e2d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
e2e0: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
e2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e300: 64 65 78 20 62 65 69 6e 67 20 70 72 6f 62 65 64  dex being probed
e310: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
e320: 63 6f 72 64 20 2a 2a 70 70 52 65 63 2c 20 20 20  cord **ppRec,   
e330: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
e340: 20 50 72 6f 62 65 20 72 65 63 6f 72 64 20 2a 2f   Probe record */
e350: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
e380: 73 69 6f 6e 20 74 6f 20 65 78 74 72 61 63 74 20  sion to extract 
e390: 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  a value from */.
e3a0: 20 20 69 6e 74 20 6e 45 6c 65 6d 2c 20 20 20 20    int nElem,    
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
e3d0: 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ber of values to
e3e0: 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
e3f0: 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   iVal,          
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e410: 41 72 72 61 79 20 65 6c 65 6d 65 6e 74 20 74 6f  Array element to
e420: 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69   populate */.  i
e430: 6e 74 20 2a 70 6e 45 78 74 72 61 63 74 20 20 20  nt *pnExtract   
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e450: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 73 20 61 70  * OUT: Values ap
e460: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 72 65  pended to the re
e470: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cord */.){.  int
e480: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e490: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 63 74 20  .  int nExtract 
e4a0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  = 0;..  if( pExp
e4b0: 72 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  r==0 || pExpr->o
e4c0: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p!=TK_SELECT ){.
e4d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
e4e0: 74 72 75 63 74 20 56 61 6c 75 65 4e 65 77 53 74  truct ValueNewSt
e4f0: 61 74 34 43 74 78 20 61 6c 6c 6f 63 3b 0a 0a 20  at4Ctx alloc;.. 
e500: 20 20 20 61 6c 6c 6f 63 2e 70 50 61 72 73 65 20     alloc.pParse 
e510: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 61 6c  = pParse;.    al
e520: 6c 6f 63 2e 70 49 64 78 20 3d 20 70 49 64 78 3b  loc.pIdx = pIdx;
e530: 0a 20 20 20 20 61 6c 6c 6f 63 2e 70 70 52 65 63  .    alloc.ppRec
e540: 20 3d 20 70 70 52 65 63 3b 0a 0a 20 20 20 20 66   = ppRec;..    f
e550: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 6c 65 6d 3b  or(i=0; i<nElem;
e560: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
e570: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
e580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
e590: 20 2a 70 45 6c 65 6d 20 3d 20 28 70 45 78 70 72   *pElem = (pExpr
e5a0: 20 3f 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   ? sqlite3Vector
e5b0: 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 45 78  FieldSubexpr(pEx
e5c0: 70 72 2c 20 69 29 20 3a 20 30 29 3b 0a 20 20 20  pr, i) : 0);.   
e5d0: 20 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69     u8 aff = sqli
e5e0: 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66  te3IndexColumnAf
e5f0: 66 69 6e 69 74 79 28 70 50 61 72 73 65 2d 3e 64  finity(pParse->d
e600: 62 2c 20 70 49 64 78 2c 20 69 56 61 6c 2b 69 29  b, pIdx, iVal+i)
e610: 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 2e 69 56  ;.      alloc.iV
e620: 61 6c 20 3d 20 69 56 61 6c 2b 69 3b 0a 20 20 20  al = iVal+i;.   
e630: 20 20 20 72 63 20 3d 20 73 74 61 74 34 56 61 6c     rc = stat4Val
e640: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
e650: 65 2c 20 70 45 6c 65 6d 2c 20 61 66 66 2c 20 26  e, pElem, aff, &
e660: 61 6c 6c 6f 63 2c 20 26 70 56 61 6c 29 3b 0a 20  alloc, &pVal);. 
e670: 20 20 20 20 20 69 66 28 20 21 70 56 61 6c 20 29       if( !pVal )
e680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6e 45   break;.      nE
e690: 78 74 72 61 63 74 2b 2b 3b 0a 20 20 20 20 7d 0a  xtract++;.    }.
e6a0: 20 20 7d 0a 0a 20 20 2a 70 6e 45 78 74 72 61 63    }..  *pnExtrac
e6b0: 74 20 3d 20 6e 45 78 74 72 61 63 74 3b 0a 20 20  t = nExtract;.  
e6c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e6d0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  .** Attempt to e
e6e0: 78 74 72 61 63 74 20 61 20 76 61 6c 75 65 20 66  xtract a value f
e6f0: 72 6f 6d 20 65 78 70 72 65 73 73 69 6f 6e 20 70  rom expression p
e700: 45 78 70 72 20 75 73 69 6e 67 20 74 68 65 20 6d  Expr using the m
e710: 65 74 68 6f 64 73 0a 2a 2a 20 61 73 20 64 65 73  ethods.** as des
e720: 63 72 69 62 65 64 20 66 6f 72 20 73 71 6c 69 74  cribed for sqlit
e730: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e740: 61 6c 75 65 28 29 20 61 62 6f 76 65 2e 20 0a 2a  alue() above. .*
e750: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
e760: 75 6c 2c 20 73 65 74 20 2a 70 70 56 61 6c 20 74  ul, set *ppVal t
e770: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e 65 77  o point to a new
e780: 20 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 61 6e   value object an
e790: 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  d return .** SQL
e7a0: 49 54 45 5f 4f 4b 2e 20 49 66 20 6e 6f 20 76 61  ITE_OK. If no va
e7b0: 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61  lue can be extra
e7c0: 63 74 65 64 2c 20 62 75 74 20 6e 6f 20 6f 74 68  cted, but no oth
e7d0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  er error occurs.
e7e0: 2a 2a 20 28 65 2e 67 2e 20 4f 4f 4d 29 2c 20 72  ** (e.g. OOM), r
e7f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
e800: 61 6e 64 20 73 65 74 20 2a 70 70 56 61 6c 20 74  and set *ppVal t
e810: 6f 20 4e 55 4c 4c 2e 20 4f 72 2c 20 69 66 20 61  o NULL. Or, if a
e820: 6e 20 65 72 72 6f 72 0a 2a 2a 20 64 6f 65 73 20  n error.** does 
e830: 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e  occur, return an
e840: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
e850: 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  de. The final va
e860: 6c 75 65 20 6f 66 20 2a 70 70 56 61 6c 0a 2a 2a  lue of *ppVal.**
e870: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
e880: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
e890: 6e 74 20 73 71 6c 69 74 65 33 53 74 61 74 34 56  nt sqlite3Stat4V
e8a0: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20  alueFromExpr(.  
e8b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8d0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
e8e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
e8f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
e900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
e910: 72 65 73 73 69 6f 6e 20 74 6f 20 65 78 74 72 61  ression to extra
e920: 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 20  ct a value from 
e930: 2a 2f 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79  */.  u8 affinity
e940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e950: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
e960: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c   to use */.  sql
e970: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56  ite3_value **ppV
e980: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
e990: 4f 55 54 3a 20 4e 65 77 20 76 61 6c 75 65 20 6f  OUT: New value o
e9a0: 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20  bject (or NULL) 
e9b0: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
e9c0: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
e9d0: 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
e9e0: 20 61 66 66 69 6e 69 74 79 2c 20 30 2c 20 70 70   affinity, 0, pp
e9f0: 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  Val);.}../*.** E
ea00: 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 2d  xtract the iCol-
ea10: 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 74  th column from t
ea20: 68 65 20 6e 52 65 63 2d 62 79 74 65 20 72 65 63  he nRec-byte rec
ea30: 6f 72 64 20 69 6e 20 70 52 65 63 2e 20 20 57 72  ord in pRec.  Wr
ea40: 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  ite.** the colum
ea50: 6e 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 70 70  n value into *pp
ea60: 56 61 6c 2e 20 20 49 66 20 2a 70 70 56 61 6c 20  Val.  If *ppVal 
ea70: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  is initially NUL
ea80: 4c 20 74 68 65 6e 20 61 20 6e 65 77 0a 2a 2a 20  L then a new.** 
ea90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
eaa0: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
eab0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 70 56  d..**.** If *ppV
eac0: 61 6c 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  al is initially 
ead0: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 63 61  NULL then the ca
eae0: 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
eaf0: 62 6c 65 20 66 6f 72 20 0a 2a 2a 20 65 6e 73 75  ble for .** ensu
eb00: 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 76 61  ring that the va
eb10: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
eb20: 20 2a 70 70 56 61 6c 20 69 73 20 65 76 65 6e 74   *ppVal is event
eb30: 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2f 0a  ually freed..*/.
eb40: 69 6e 74 20 73 71 6c 69 74 65 33 53 74 61 74 34  int sqlite3Stat4
eb50: 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
eb60: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
eb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
eb80: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
eb90: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 52    const void *pR
eba0: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
ebb0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ebc0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
ebd0: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
ebe0: 74 20 6e 52 65 63 2c 20 20 20 20 20 20 20 20 20  t nRec,         
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec00: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
ec10: 70 52 65 63 20 69 6e 20 62 79 74 65 73 20 2a 2f  pRec in bytes */
ec20: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
ec50: 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 73 71 6c  extract */.  sql
ec60: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56  ite3_value **ppV
ec70: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
ec80: 4f 55 54 3a 20 45 78 74 72 61 63 74 65 64 20 76  OUT: Extracted v
ec90: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  alue */.){.  u32
eca0: 20 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   t = 0;         
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecc0: 61 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 63 6f  a column type co
ecd0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72  de */.  int nHdr
ece0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ecf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
ed00: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  of the header in
ed10: 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
ed20: 20 69 6e 74 20 69 48 64 72 3b 20 20 20 20 20 20   int iHdr;      
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 20 2f 2a 20 4e 65 78 74 20 75 6e 72 65 61 64 20   /* Next unread 
ed50: 68 65 61 64 65 72 20 62 79 74 65 20 2a 2f 0a 20  header byte */. 
ed60: 20 69 6e 74 20 69 46 69 65 6c 64 3b 20 20 20 20   int iField;    
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 2f 2a 20 4e 65 78 74 20 75 6e 72 65 61 64 20   /* Next unread 
ed90: 64 61 74 61 20 62 79 74 65 20 2a 2f 0a 20 20 69  data byte */.  i
eda0: 6e 74 20 73 7a 46 69 65 6c 64 20 3d 20 30 3b 20  nt szField = 0; 
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
edc0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63 75  * Size of the cu
edd0: 72 72 65 6e 74 20 64 61 74 61 20 66 69 65 6c 64  rrent data field
ede0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
ee10: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 61  index */.  u8 *a
ee20: 20 3d 20 28 75 38 2a 29 70 52 65 63 3b 20 20 20   = (u8*)pRec;   
ee30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
ee40: 70 65 63 61 73 74 20 62 79 74 65 20 61 72 72 61  pecast byte arra
ee50: 79 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  y */.  Mem *pMem
ee60: 20 3d 20 2a 70 70 56 61 6c 3b 20 20 20 20 20 20   = *ppVal;      
ee70: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ee80: 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68 69 73  result into this
ee90: 20 4d 65 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a   Mem object */..
eea0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 30    assert( iCol>0
eeb0: 20 29 3b 0a 20 20 69 48 64 72 20 3d 20 67 65 74   );.  iHdr = get
eec0: 56 61 72 69 6e 74 33 32 28 61 2c 20 6e 48 64 72  Varint32(a, nHdr
eed0: 29 3b 0a 20 20 69 66 28 20 6e 48 64 72 3e 6e 52  );.  if( nHdr>nR
eee0: 65 63 20 7c 7c 20 69 48 64 72 3e 3d 6e 48 64 72  ec || iHdr>=nHdr
eef0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ef00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ef10: 20 69 46 69 65 6c 64 20 3d 20 6e 48 64 72 3b 0a   iField = nHdr;.
ef20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 43    for(i=0; i<=iC
ef30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 48  ol; i++){.    iH
ef40: 64 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dr += getVarint3
ef50: 32 28 26 61 5b 69 48 64 72 5d 2c 20 74 29 3b 0a  2(&a[iHdr], t);.
ef60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 48      testcase( iH
ef70: 64 72 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 20 20  dr==nHdr );.    
ef80: 74 65 73 74 63 61 73 65 28 20 69 48 64 72 3d 3d  testcase( iHdr==
ef90: 6e 48 64 72 2b 31 20 29 3b 0a 20 20 20 20 69 66  nHdr+1 );.    if
efa0: 28 20 69 48 64 72 3e 6e 48 64 72 20 29 20 72 65  ( iHdr>nHdr ) re
efb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
efc0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 7a  UPT_BKPT;.    sz
efd0: 46 69 65 6c 64 20 3d 20 73 71 6c 69 74 65 33 56  Field = sqlite3V
efe0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
eff0: 28 74 29 3b 0a 20 20 20 20 69 46 69 65 6c 64 20  (t);.    iField 
f000: 2b 3d 20 73 7a 46 69 65 6c 64 3b 0a 20 20 7d 0a  += szField;.  }.
f010: 20 20 74 65 73 74 63 61 73 65 28 20 69 46 69 65    testcase( iFie
f020: 6c 64 3d 3d 6e 52 65 63 20 29 3b 0a 20 20 74 65  ld==nRec );.  te
f030: 73 74 63 61 73 65 28 20 69 46 69 65 6c 64 3d 3d  stcase( iField==
f040: 6e 52 65 63 2b 31 20 29 3b 0a 20 20 69 66 28 20  nRec+1 );.  if( 
f050: 69 46 69 65 6c 64 3e 6e 52 65 63 20 29 20 72 65  iField>nRec ) re
f060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f070: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20  UPT_BKPT;.  if( 
f080: 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pMem==0 ){.    p
f090: 4d 65 6d 20 3d 20 2a 70 70 56 61 6c 20 3d 20 73  Mem = *ppVal = s
f0a0: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
f0b0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  b);.    if( pMem
f0c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
f0d0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
f0e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
f0f0: 65 53 65 72 69 61 6c 47 65 74 28 26 61 5b 69 46  eSerialGet(&a[iF
f100: 69 65 6c 64 2d 73 7a 46 69 65 6c 64 5d 2c 20 74  ield-szField], t
f110: 2c 20 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d  , pMem);.  pMem-
f120: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
f130: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f140: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  OK;.}../*.** Unl
f150: 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
f160: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  the argument mus
f170: 74 20 62 65 20 61 6e 20 55 6e 70 61 63 6b 65 64  t be an Unpacked
f180: 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 20 72 65  Record object re
f190: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 20 61 6e 20  turned.** by an 
f1a0: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
f1b0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
f1c0: 65 53 65 74 56 61 6c 75 65 28 29 2e 20 54 68 69  eSetValue(). Thi
f1d0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 0a 2a  s call deletes.*
f1e0: 2a 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  * the object..*/
f1f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
f200: 74 34 50 72 6f 62 65 46 72 65 65 28 55 6e 70 61  t4ProbeFree(Unpa
f210: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
f220: 29 7b 0a 20 20 69 66 28 20 70 52 65 63 20 29 7b  ){.  if( pRec ){
f230: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
f240: 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 52 65 63 2d  int nCol = pRec-
f250: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  >pKeyInfo->nAllF
f260: 69 65 6c 64 3b 0a 20 20 20 20 4d 65 6d 20 2a 61  ield;.    Mem *a
f270: 4d 65 6d 20 3d 20 70 52 65 63 2d 3e 61 4d 65 6d  Mem = pRec->aMem
f280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
f290: 62 20 3d 20 61 4d 65 6d 5b 30 5d 2e 64 62 3b 0a  b = aMem[0].db;.
f2a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f2b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
f2d0: 65 6c 65 61 73 65 28 26 61 4d 65 6d 5b 69 5d 29  elease(&aMem[i])
f2e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f2f0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
f300: 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  pRec->pKeyInfo);
f310: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
f320: 65 65 4e 4e 28 64 62 2c 20 70 52 65 63 29 3b 0a  eeNN(db, pRec);.
f330: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
f340: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f350: 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  BLE_STAT4 */../*
f360: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
f370: 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 61  tring value of a
f380: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
f390: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
f3a0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
f3b0: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r(.  sqlite3_val
f3c0: 75 65 20 2a 76 2c 20 20 20 20 20 2f 2a 20 56 61  ue *v,     /* Va
f3d0: 6c 75 65 20 74 6f 20 62 65 20 73 65 74 20 2a 2f  lue to be set */
f3e0: 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
f3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
f400: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 20 2a  th of string z *
f410: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
f420: 7a 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  z,        /* Tex
f430: 74 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 72  t of the new str
f440: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c  ing */.  u8 enc,
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f460: 2a 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73  * Encoding to us
f470: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
f480: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 2f 2a 20  el)(void*)   /* 
f490: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
f4a0: 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  he string */.){.
f4b0: 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
f4c0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 28  3VdbeMemSetStr((
f4d0: 4d 65 6d 20 2a 29 76 2c 20 7a 2c 20 6e 2c 20 65  Mem *)v, z, n, e
f4e0: 6e 63 2c 20 78 44 65 6c 29 3b 0a 7d 0a 0a 2f 2a  nc, xDel);.}../*
f4f0: 0a 2a 2a 20 46 72 65 65 20 61 6e 20 73 71 6c 69  .** Free an sqli
f500: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
f510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f520: 56 61 6c 75 65 46 72 65 65 28 73 71 6c 69 74 65  ValueFree(sqlite
f530: 33 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 69  3_value *v){.  i
f540: 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
f550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
f560: 52 65 6c 65 61 73 65 28 28 4d 65 6d 20 2a 29 76  Release((Mem *)v
f570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
f580: 65 65 4e 4e 28 28 28 4d 65 6d 2a 29 76 29 2d 3e  eeNN(((Mem*)v)->
f590: 64 62 2c 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, v);.}../*.**
f5a0: 20 54 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75   The sqlite3Valu
f5b0: 65 42 79 74 65 73 28 29 20 72 6f 75 74 69 6e 65  eBytes() routine
f5c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
f5d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
f5e0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
f5f0: 61 6c 75 65 20 6f 62 6a 65 63 74 20 61 73 73 75  alue object assu
f600: 6d 69 6e 67 20 74 68 61 74 20 69 74 20 75 73 65  ming that it use
f610: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 22  s the encoding "
f620: 65 6e 63 22 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  enc"..** The val
f630: 75 65 42 79 74 65 73 28 29 20 72 6f 75 74 69 6e  ueBytes() routin
f640: 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 75  e is a helper fu
f650: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
f660: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
f670: 45 20 69 6e 74 20 76 61 6c 75 65 42 79 74 65 73  E int valueBytes
f680: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  (sqlite3_value *
f690: 70 56 61 6c 2c 20 75 38 20 65 6e 63 29 7b 0a 20  pVal, u8 enc){. 
f6a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 54 6f 54   return valueToT
f6b0: 65 78 74 28 70 56 61 6c 2c 20 65 6e 63 29 21 3d  ext(pVal, enc)!=
f6c0: 30 20 3f 20 70 56 61 6c 2d 3e 6e 20 3a 20 30 3b  0 ? pVal->n : 0;
f6d0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 61  .}.int sqlite3Va
f6e0: 6c 75 65 42 79 74 65 73 28 73 71 6c 69 74 65 33  lueBytes(sqlite3
f6f0: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 75 38  _value *pVal, u8
f700: 20 65 6e 63 29 7b 0a 20 20 4d 65 6d 20 2a 70 20   enc){.  Mem *p 
f710: 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20 20  = (Mem*)pVal;.  
f720: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
f730: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
f740: 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20   || (p->flags & 
f750: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
f760: 62 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  b))==0 );.  if( 
f770: 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  (p->flags & MEM_
f780: 53 74 72 29 21 3d 30 20 26 26 20 70 56 61 6c 2d  Str)!=0 && pVal-
f790: 3e 65 6e 63 3d 3d 65 6e 63 20 29 7b 0a 20 20 20  >enc==enc ){.   
f7a0: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 3b 0a 20 20   return p->n;.  
f7b0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
f7c0: 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 21 3d 30  s & MEM_Blob)!=0
f7d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66   ){.    if( p->f
f7e0: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
f7f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f800: 70 2d 3e 6e 20 2b 20 70 2d 3e 75 2e 6e 5a 65 72  p->n + p->u.nZer
f810: 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
f820: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 3b      return p->n;
f830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f840: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
f850: 4e 75 6c 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  Null ) return 0;
f860: 0a 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 42  .  return valueB
f870: 79 74 65 73 28 70 56 61 6c 2c 20 65 6e 63 29 3b  ytes(pVal, enc);
f880: 0a 7d 0a                                         .}.